ElasticSearch默认评分机制

时间:2013-07-08 08:40:46

标签: search lucene elasticsearch scoring

我正在寻找的是ElasticSearch(Lucene)的默认评分机制如何真正起作用的简单明了的解释。我的意思是,它是否使用Lucene得分,或者它可能使用自己的得分?

例如,我想通过“名称”字段搜索文档。我使用.NET NEST客户端来编写查询。我们来考虑这种类型的查询:

IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s =>
    s.From(0)
   .Size(300)
   .Explain()
   .Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName")))
);

转换为此类JSON查询:

{
 "from": 0,
 "size": 300,
 "explain": true,
 "query": {
   "match": {
     "Name": {
       "query": "ExampleName"
      }
    }
  }
}

执行搜索的文档大约有110万个。我得到的回报是(这只是结果的一部分,我自己格式化):

650   "ExampleName" 7,313398

651   "ExampleName" 7,313398

652   "ExampleName" 7,313398

653   "ExampleName" 7,239194

654   "ExampleName" 7,239194

860   "ExampleName of Something" 4,5708737  

其中第一个字段只是一个Id,第二个是ElasticSearch执行搜索的名称字段,第三个是得分。

如您所见,ES索引中有许多重复项。由于一些已发现的文档具有不同的分数,尽管它们完全相同(只有不同​​的Id),我得出结论,不同的分片在整个数据集的不同部分上进行搜索,这使我得出结论,分数在某种程度上基于整体给定分片中的数据,而不仅仅是搜索引擎实际考虑的文档。

问题是,这个得分究竟是如何运作的?我的意思是,你能告诉我/给我看/给我一个确切的公式来计算ES发现的每个文件的分数吗?最终,这个评分机制如何改变?

3 个答案:

答案 0 :(得分:13)

默认评分是核心Lucene中的DefaultSimilarity算法largely documented here。您可以通过配置your own Similarity或使用类似custom_score query的内容来自定义评分。

显示的前五个结果中的奇数分数变化看起来很小,以至于它与我的关系不大,只要查询结果的有效性及其排序,但如果你想了解它的原因,那么explain api可以准确地向您显示正在发生的事情。

答案 1 :(得分:2)

分数变化基于给定分片中的数据(如您所怀疑的那样)。默认情况下,ES使用名为“查询然后获取”的搜索类型,将查询发送到每个分片,使用本地TDIF查找所有匹配的文档(这将根据给定分片上的数据而有所不同) - 这是你的问题)。

您可以使用' dfs查询然后获取'搜索类型来更改此项 - 预先查询每个分片询问术语和文档频率,然后向每个分片发送查询等。

您可以在网址

中进行设置
$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{
  "from": 0,
  "size": 300,
  "explain": true,
  "query": {
    "match": {
      "Name": {
        "query": "ExampleName"
      }
    }
  }
}' 

答案 2 :(得分:1)