Elasticsearch在多个索引上的得分

Eya*_* Ch 4 elasticsearch

我有一年中任一季度的索引(“ index-2015.1”,“ index-2015.2” ...)

我每个索引上大约有3000万份文档。

文档具有文本字段(“标题”)

我的文档排序方法是(1)_score(2)创建日期

问题是:

当在“标题”字段中为所有索引(“ index-201 *”)搜索某些文本时,总是第一个结果来自一个索引。

可以说,如果我正在搜索“ title = home”,并且我在title = home的“ index-2015.1”上有1万个文档,而在title = home的“ index-2015.2”上有10k个文档,那么第一个结果就是“ index”中的所有文档-2015.1”(而不是“ index-2015.2”中的值,或者不是混合的),甚至在“ index-2015.2”中也有“创建日期”比“ index-2015.1”中更高的文档。

是否有一个原因?

Slo*_*omo 6

原因可能是分数是特定于索引的。因此,如果您确实有多个索引,则每个索引的文档结果得分将(略有不同)计算得出。

简而言之,匹配文档的分数取决于查询词及其在索引中的出现。得分是根据索引(实际上,默认情况下甚至是每个单独的分片)计算得出的。elasticsearch可以进行一些标准化,但是我不知道这些细节。

我真的不能很好地解释它,但是这里是有关得分的文章。我认为您至少要阅读有关TF / IDF的部分。我认为,这应该解释为什么您获得不同的分数。

https://www.elastic.co/guide/zh-CN/elasticsearch/guide/current/scoring-theory.html


编辑:

因此,在我的机器上对其进行一点测试之后,似乎可以使用另一个search_type来获得适合您情况的分数。

POST /index1,index2/_search?search_type=dfs_query_then_fetch
{
    "query" : {
       "match": {
          "title": "home"
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的部分是search_type = dfs_query_then_fetch。如果您正在编程Java或类似的东西,应该有一种在请求中指定它的方法。有关search_types的详细信息,请参阅文档

基本上,它将首先收集所有受影响分片(+索引)上的术语频率。因此,应该对所有这些分数进行概括。