弹性搜索精确匹配

Posted

技术标签:

【中文标题】弹性搜索精确匹配【英文标题】:Elastic search exact match 【发布时间】:2013-09-03 17:45:10 【问题描述】:

我正在使用elasticsearch,并且正忙着让精确匹配发生。我尝试了 match、query_string 等的各种组合,但要么一无所获,要么结果不好。 查询如下所示:


  "filter": 
    "term": 
      "term": "dog",
      "type": "main"
    
  ,
  "query": 
    "match_phrase": 
      "term": "Dog"
    
  ,
  "sort": [
    "_score"
  ]

排序结果

10.102211 u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506
10.102211 u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664
10.102211 u'term': u'Dog', u'type': u'main', u'conceptid': 144
7.147442 u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'

我当然知道“The Dog”、“That Dog”和“Dog”都有相同的分数,但我需要弄清楚如何提高精确匹配“Dog”的分数。

我也试过了


  "sort": [
    "_score"
  ],
  "query": 
    "bool": 
      "must": [
        
          "match": 
            "term": "Dog"
          
        ,
        
          "match_phrase": 
            "term": 
              "query": "Dog",
              "boost": 5
            
          
        
      ]
    
  ,
  "filter": 
    "term": 
      "term": "dog",
      "type": "main"
    
  

但这仍然只是给我

11.887239 u'term': u'The Dog', u'type': u'main', u'conceptid': 7730506
11.887239 u'term': u'That Dog', u'type': u'main', u'conceptid': 4345664
11.887239 u'term': u'Dog', u'type': u'main', u'conceptid': 144
8.410372 u'term': u'Dog Eat Dog (song)', u'type': u'main', u'conceptid': u'5288184'

【问题讨论】:

【参考方案1】:

默认情况下使用标准分析器分析字段。如果您想检查完全匹配,您可以存储未分析的字段,例如:

"dog":
            "type":"multi_field",
            "fields":
                "dog":
                    "include_in_all":false,
                    "type":"string",
                    "index":"not_analyzed",
                    "store":"no"
                ,
                "_tokenized":
                    "include_in_all":false,
                    "type":"string",
                    "index":"analyzed",
                    "store":"no"
                
            
        

然后您可以查询 dog-field 以获得精确匹配,并使用 dog._tokenized 进行分析查询(如全文)

【讨论】:

这需要更改所有记录吗?我在这个索引中有大约 50,000,000 条(非常小的)记录。还是在适当的情况下使用此结构对索引进行核对并重新导入是否更有意义?我是 Lucene 的新手,如果我这样存储数据,我的 ES 查询将如何变化?谢谢你的帮助!我打算在这里询问设计索引的最佳方法,但我认为我会提出另一个问题。 这正是我所需要的,我最终还是重建了数据,因为我想以不同的方式获得它,但我以此作为我的方法的基础。谢谢!【参考方案2】:

我认为您的问题是字段term 正在使用标准分析器进行分析(检查您的映射),并且正在过滤诸如thethat 之类的停用词。因此,DogThe Dog 的得分相同。所以也许你可以通过配置自定义分析器来解决你的问题 => documentation page

【讨论】:

【参考方案3】:

将需要搜索的两个值散列成hash key,然后搜索。

【讨论】:

以上是关于弹性搜索精确匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用弹性搜索查询查找多个精确值

在数组中查找多个精确值

Solr的精确匹配搜索

Ag / Grep 仅精确匹配搜索

使用 JavaScript 在 JSON 中搜索精确匹配

具有精确词匹配搜索的 RDD 过滤器