Поиск ElasticSearch дает плохие результаты

Я новичок в ElasticSearch, и у меня возникают проблемы с получением результатов поиска, которые я считаю хорошими. Моя цель - иметь возможность искать индекс лекарств (6 полей) по фразе, которую вводит пользователь. Это может быть одно или несколько слов. Я пробовал несколько подходов, но ниже я опишу лучший из найденных. Дайте мне знать, что я делаю неправильно. Я предполагаю, что мне не хватает чего-то фундаментального.

Вот подмножество полей, с которыми я работаю

...
    "hits": [
         {
            "_index": "indexus2",
            "_type": "Medication",
            "_id": "17471",
            "_score": 8.829264,
            "_source": {
               "SearchContents": " chew chewable oral po tylenol",
               "MedShortDesc": "Tylenol PO Chew",
               "MedLongDesc": "Tylenol Oral Chewable"
               "GenericDesc": "ACETAMINOPHEN ORAL"
               ...
            }
         }
         ...

Поля, которые я ищу, использовали анализатор Edge NGram. Я использую библиотеку C# Nest для индексации.

 settings.Analysis.Tokenizers.Add("edgeNGram", new EdgeNGramTokenizer()
            {
                MaxGram = 50,
                MinGram = 2,
                TokenChars = new List<string>() { "letter", "digit" }
            });

    settings.Analysis.Analyzers.Add("edgeNGramAnalyzer", new CustomAnalyzer()
            {
                Filter = new string[] { "lowercase" },
                Tokenizer = "edgeNGram"
            });

Я использую запрос more_like_this для рассматриваемых полей

GET indexus2/Medication/_search
{
  "query": {
    "more_like_this" : {
        "fields" : ["MedShortDesc", 
                    "MedLongDesc", 
                    "GenericDesc",
                    "SearchContents"],
        "like_text" : "vicodin",
        "min_term_freq" : 1,
        "max_query_terms" : 25,
        "min_word_len": 2
    }
  }
}

Проблема в том, что для этого поиска «викодин» я ожидаю сначала увидеть совпадения с полной работой, но я этого не делаю. Вот подмножество результатов этого запроса. Викодин не появляется до 7-го результата

"hits": [
         {
            "_index": "indexus2",
            "_type": "Medication",
            "_id": "31192",
            "_score": 4.567309,
            "_source": {
               "SearchContents": " oral po victrelis",
               "MedShortDesc": "Victrelis PO",
               "MedLongDesc": "Victrelis Oral",
               "RepresentativeRoutedGenericDesc": "BOCEPREVIR ORAL",
               ...
            }
         }
         <5 more similar results>
         {
            "_index": "indexus2",
            "_type": "Medication",
            "_id": "26198",
            "_score": 2.2836545,
            "_source": {
               "SearchContents": " (original 5 500 feeding mg strength) tube via vicodin",
               "MedShortDesc": "Vicodin 5 mg-500 mg (Original Strength) via feeding tube",
               "MedLongDesc": "Vicodin 5 mg-500 mg (Original Strength) via feeding tube",
               "GenericDesc": "HYDROCODONE BITARTRATE/ACETAMINOPHEN ORAL",
             ...
            }
          }

Сопоставления полей

"OrderableMedLongDesc": {
      "type": "string",
      "analyzer": "edgeNGramAnalyzer"
},
"OrderableMedShortDesc": {
       "type": "string",
       "analyzer": "edgeNGramAnalyzer"
},
"RepresentativeRoutedGenericDesc": {
       "type": "string",
       "analyzer": "edgeNGramAnalyzer"
},
"SearchContents": {
       "type": "string",
        "analyzer": "edgeNGramAnalyzer"
},

Вот что показывает ES для моих _settings для анализаторов

          "analyzer": {
             "edgeNGramAnalyzer": {
                 "type": "custom",
                 "filter": [
                    "lowercase"
                 ],
                 "tokenizer": "edgeNGram"
              }
           },
           "tokenizer": {
              "edgeNGram": {
                 "min_gram": "2",
                 "type": "edgeNGram",
                 "max_gram": "50"
              }
           }

person Dennis    schedule 18.08.2015    source источник
comment
Вы можете опубликовать сопоставление для полей   -  person keety    schedule 18.08.2015
comment
@keety, я обновил пост, чтобы добавить эту деталь. Спасибо   -  person Dennis    schedule 18.08.2015


Ответы (1)


В соответствии с приведенным выше сопоставлением edgeNGramAnalyzer является поиском -analyzer для полей, в результате чего поисковый запрос также получит "грань грамматики". Вы, вероятно, не хотите этого.

Измените сопоставление, чтобы установить только параметр index_analyzer как edgeNgramAnalyzer.

Тогда search_analyzer по умолчанию будет standard.

Пример:

"SearchContents": {
       "type": "string",
        "index_analyzer": "edgeNGramAnalyzer"
},
person keety    schedule 18.08.2015
comment
Это выглядит намного лучше. Спасибо! - person Dennis; 20.08.2015
comment
Я обнаружил, что все как есть было не совсем правильным... Я смог очень хорошо поднять свой первоначальный пример... но другие наркотики, которые должны были быть проиндексированы таким же образом, вообще не найдены. Я обнаружил, что если я использую multi_match вместо more_like_this, кажется, что все работает так, как ожидалось. Любые идеи о том, почему это было бы? - person Dennis; 25.08.2015