2016-04-06 2 views
0

У меня есть поле под типом компании в моем индексе elasticsearch, который отражает технологии, которые использует компания. Поэтому люди, приходящие на наш сайт, могут ввести java, Java, C#, c#, .Net, .net и т. Д. В поле поиска, чтобы получить компании.Как искать # или. в Elasticsearch

Первоначально я проиндексировал это по умолчанию, а затем не смог найти .Net или C#, так как в поисковом запросе были подстановочные знаки. Когда я искал Net или C, он возвращал компании, которые используют C или C#, что еще раз.

Я провел некоторое исследование и изменил отображение поля на "index": "not_analyzed" и переиндексировал компании. Теперь он вернул правильные компании для C# и .Net, но в случае неудачи в этом случае поисковый запрос не был точным совпадением. Таким образом, он не возвращал компании с технологиями Java, когда поисковый запрос был java, но он корректно возвращался, когда поисковый запрос был java. Я понимаю, что not_analyzed требует точного соответствия

Как мне проиндексировать и запрашивать одно и то же поле, чтобы разобраться в обоих этих случаях?

ответ

2

Способ достижения того, что вам нужно, - создать пользовательский анализатор, который немного больше, чем то, что делает not_analyzed, т. Е. Также строчные условия.

curl -XPUT localhost:9200/test_index -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "lowercase_keyword": { 
      "type": "custom", 
      "tokenizer": "keyword", 
      "filter": [ "lowercase" ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test_type": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "analyzer": "lowercase_keyword" 
     } 
     } 
    } 
    } 
}' 

Затем, когда вы индексировать документ, который содержит Java, он будет индексироваться java, C# как c# и т.д.

Это принесет преимущества регистронезависимых точных совпадений.

+0

Это работает. Благодарю. –

+0

Ницца, рад, что все получилось! – Val