14

我正在寻找的是关于 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 找到的每个文档的分数吗?最终,如何改变这种评分机制?

4

3 回答 3

15

默认评分是核心 Lucene 中的 DefaultSimilarity 算法,主要记录在此处。您可以通过配置自己的Similarity评分或使用类似custom_score查询的方式来自定义评分。

显示的前五个结果中的奇数变化似乎足够小,就查询结果的有效性及其排序而言,我并不关心,但如果你想了解它的原因,explainapi可以显示你到底是怎么回事。

于 2013-07-08T16:55:01.597 回答
3

The score variation is based on the data in a given shard (like you suspected). By default ES uses a search type called 'query then fetch' which, sends the query to each shard, finds all the matching documents with scores using local TDIFs (this will vary based on data on a given shard - here's your problem).

You can change this by using 'dfs query then fetch' search type - prequery each shard asking about term and document frequencies and then sends a query to each shard etc..

You can set it in the url

$ 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"
      }
    }
  }
}' 
于 2015-02-10T19:32:47.103 回答
1

ElasticSearch 文档中有很好的解释:

于 2015-08-28T12:14:58.910 回答