【问题标题】:ElasticSearch search getting bad resultsElasticSearch 搜索结果不佳
【发布时间】:2015-11-11 13:23:33
【问题描述】:

我是 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
    }
  }
}

问题在于,对于“vicodin”的搜索,我希望首先看到与完整作品的匹配,但我没有。这是此查询结果的子集。 Vicodin 直到第 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 for analyzers 显示的内容

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

【问题讨论】:

  • 你能贴出这些字段的映射吗
  • @keety,我更新了帖子以添加该详细信息。谢谢

标签: c# nest elasticsearch


【解决方案1】:

根据上面的映射edgeNGramAnalyzer 是字段的search-analyzer,因此搜索查询也将获得“edge ngrammed”。你可能不想要这个。

更改映射以仅将index_analyzer 选项设置为edgeNgramAnalyzer

search_analyzer 将默认为 standard

例子:

"SearchContents": {
       "type": "string",
        "index_analyzer": "edgeNGramAnalyzer"
},

【讨论】:

  • 这看起来好多了。谢谢!
  • 我发现事情并不完全正确......我能够很好地提取我的初始示例集......但其他应该以相同方式索引的药物是根本没找到。我确实发现,如果我使用 multi_match 而不是 more_like_this,似乎一切都按预期工作。关于为什么会这样的任何想法?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2012-08-30
  • 2015-03-22
  • 2021-03-24
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多