【问题标题】:Elasticsearch query returns strange sorted (score based) resultElasticsearch 查询返回奇怪的排序(基于分数)结果
【发布时间】:2018-02-11 23:49:08
【问题描述】:

我正在使用 Elasticsearch v5.3.2

我有以下映射:

{
   "mappings":{
      "info":{
         "_all":{
            "enabled": false
         },
         "properties":{
            "info":{
               "properties":{
                  "email":{
                     "doc_values":"false",
                     "fields":{
                        "ngram":{
                           "analyzer":"custom_nGram_analyzer",
                           "type":"text"
                        }
                     },
                     "type":"keyword"
                  }
               }
            }
         }
     }
  },
  "settings":{
      "analysis":{
         "analyzer":{
             "custom_nGram_analyzer":{
                "filter":[
                   "lowercase",
                   "asciifolding",
                   "custom_nGram_filter"
                ],
                "tokenizer":"whitespace",
                "type":"custom"
            }
        },
        "filter":{
            "custom_nGram_filter":{
               "max_gram":16,
               "min_gram":3,
               "type":"ngram"
            }
        }
      }
   }
}

当我执行以下查询时,我在文档分数方面看到了非常奇怪的结果:

GET /info_2017_08/info/_search
{
  "query": {
      "multi_match": {
          "query": "hotmail",
          "fields": [
              "info.email.ngram"
          ]
      }
  }
}

它带来了以下结果:

"hits": {
    "total": 3,
    "max_score": 1.3834574,
    "hits": [
      {
        "_index": "info_2017_08",
        "_type": "info",
        "_id": "AV4uQnCjzNcTF2GMY730",
        "_score": 1.3834574,
        "_source": {
            "info": {
                 "email": "pv53p8vg@gmail.com"
             }
        }
     },
     {
        "_index": "info_2017_08",
        "_type": "info",
        "_id": "AV4uQm93zNcTF2GMY73x",
        "_score": 0.3967861,
        "_source": {
            "info": {            
                "email": "-vb6sbw54@hotmail.com"
            }
        }
     },
     {
         "_index": "info_2017_08",
         "_type": "info",
         "_id": "AV4uQmYbzNcTF2GMY73P",
         "_score": 0.36409757,
         "_source": {
             "info": {
                 "email": "985pu4c.r02a@gmail.com"
             }
         }
     }
  ]
}

现在注意分数。如果第一个结果是 ...@gmail.com 而第二个结果是 ...@hotmail.com,如果我搜索了“hotmail”一词,为什么第一个结果比第二个结果得分更高?

第二个应该用ngram“mail”和“hotmail”匹配查询,而第一个只会用ngram“mail”匹配查询,那么是什么原因导致这样的结果呢?

提前致谢。

【问题讨论】:

    标签: sorting elasticsearch n-gram scoring


    【解决方案1】:

    Elasticsearch 使用 TF/IDF 统计数据独立计算每个分片上的文档分数。因此,如果您有两个带有下一个内容的分片:

    1. “info.email”:“985pu4c.r02a@gmail.com”
    2. “info.email”:“1085pu4c.r02a@gmail.com”,“info.email”:“-vb6sbw54@hotmail.com”

    那么对于您的特定查询,来自第一个分片的单个文档的得分将高于来自第二个分片的任何文档。

    您可以使用下一个 API 调用检查每个分片的内容:GET index/_search?preference=_shards:0

    【讨论】:

    • 是的,你是对的,我也发现了这一点。当我使用查询参数search_type=dfs_query_then_fetch 进行相同的查询时,我得到的hotmail 得分高于任何其他gmail。现在我必须找出搜索类型在查询性能方面的区别。如果你有这方面的信息,我想知道。谢谢。
    • 这将对性能产生影响,因为它需要分片之间的额外往返 -details here。在这个ES-guide 中,您甚至可以找到一句话:Don't use dfs_query_then_fetch in production... 作为替代方案,您可以尝试使用Routing 以确保所有相关文档都转到同一个分片,或者使用单个分片。
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2020-04-06
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多