ngram 匹配对不太相关的文档给出相同的分数

Posted

技术标签:

【中文标题】ngram 匹配对不太相关的文档给出相同的分数【英文标题】:ngram matching gives same score to less relevant documents 【发布时间】:2020-08-24 16:36:59 【问题描述】:

我正在我的 elasticsearch 索引中搜索 Bob Smith。结果 Bob Smith 和 Bobbi Smith 都以相同的分数返回响应。我希望 Bob Smith 获得更高的分数,以便它首先出现在我的结果集中。为什么分数相等?

这是我的查询


    "query": 
        "query_string": 
            "query": "Bob Smith",
            "fields": [
                "text_field"
            ]
        
    
 

以下是我的索引设置。我正在使用此处描述的 ngram 令牌过滤器:https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch


    "contacts_5test": 
        "aliases": ,
        "mappings": 
            "properties": 
                "text_field": 
                    "type": "text",
                    "term_vector": "yes",
                    "analyzer": "ngram_filter_analyzer"
                
            
        ,
        "settings": 
            "index": 
                "number_of_shards": "1",
                "provided_name": "contacts_5test",
                "creation_date": "1588987227997",
                "analysis": 
                    "filter": 
                        "ngram_filter": 
                            "type": "nGram",
                            "min_gram": "4",
                            "max_gram": "4"
                        
                    ,
                    "analyzer": 
                        "ngram_filter_analyzer": 
                            "filter": [
                                "lowercase",
                                "ngram_filter"
                            ],
                            "type": "custom",
                            "tokenizer": "standard"
                        
                    
                ,
                "number_of_replicas": "1",
                "uuid": "HqOXu9bNRwCHSeK39WWlxw",
                "version": 
                    "created": "7060199"
                
            
        
    

这是我的查询结果...

"hits": [
  
    "_index": "contacts_5test",
    "_type": "_doc",
    "_id": "1",
    "_score": 0.69795835,
    "_source": 
      "text_field": "Bob Smith"
    
  ,
  
    "_index": "contacts_5test",
    "_type": "_doc",
    "_id": "2",
    "_score": 0.69795835,
    "_source": 
      "text_field": "Bobbi Smith"
    
  
]

如果我改为搜索 Bobbi Smith,elastic 会返回两个文档,但 Bobbi Smith 的得分更高。这更有意义。

【问题讨论】:

【参考方案1】:

我能够重现您的问题,原因是使用了您的 ngram_filter,它不会为 bob 创建任何令牌,因为令牌的最小长度应为 4 而标准标记器创建了bob 标记,但随后它在您的ngram_filter 中被过滤掉,您将min_gram 称为4

即使我尝试将min_gram 的长度减少到3,这将创建令牌,但问题是bobbobbie 将具有相同的bob 令牌,因此它们的得分将一样。

当您搜索Bobbi Smith 时,bobbi 即确切的标记将只出现在一个文档中,因此您获得更高的分数。

注意:- 请使用analyze API 和explain API 检查生成的令牌以及它们是如何匹配的,这将有助于您理解问题和我的详细解释以及我的

【讨论】:

有没有办法调整 ngram 过滤器,以便我们可以让 Bobbi 在搜索“Bob”时出现在结果中? 您的意思是Bobbi 不会出现在搜索结果中或分数较低? @GNG,这也像是一个新要求,我尝试过,但实现起来并不简单,请您投票并接受此答案,因为它提供了您寻求的澄清并提出另一个问题的答案并在这里发表评论,我会调查一下。

以上是关于ngram 匹配对不太相关的文档给出相同的分数的主要内容,如果未能解决你的问题,请参考以下文章

将 ngram 与 elasticsearch 一起使用时带回所有相关结果

Solr:准确匹配的得分高于部分匹配

如何让 elasticsearch 为匹配顺序的标记字符串分配更高的分数?

流星实时游戏 - 根据他们的分数匹配两名玩家?

在 MySQL 中查找最长匹配的 ngram

P1140 相似基因