Elasticsearch的结果数随分页而变化



我使用的是Elasticsearch 7.6.0,并且已经对我的一个查询进行了分页。它似乎工作得很好,我可以使用搜索fromsize参数来改变每页和所选页面的结果数。

query = 'sample query'
items_per_page = 12
page = 0
es_query = {'query': {
'bool': {
'must': [{
'multi_match': {
'query': query,
"fuzziness": "AUTO",
"operator": "and",
'fields': ['title^2', 'description']
},
}]
}
}, 'min_score': 5.0}
res = es.search(index='my-index', body=es_query, size=items_per_page, from_=items_per_page*page)
hits = sorted(res['hits']['hits'], key=lambda x: x['_score'], reverse=True)
print(res['hits']['total']['value']) # This changes depending on the page provided

我注意到返回的结果数量取决于提供的页面,这对我来说毫无意义!结果的数量也在波动,这让我更加困惑:第0页,共233项。第1页,157项。第2页,157项。第3页,233项。。。

为什么res['hits']['total']['value']依赖于大小和参数?

搜索是分布式的,并被发送到所有拥有与搜索索引匹配的碎片的节点。然后,所有结果都将被合并并返回。有时,并不是所有的碎片都能被搜索到。当

  • 集群非常繁忙
  • 由于恢复过程,特定碎片不可用
  • 搜索已经优化,碎片也被省略了

在响应中,有一个_shards部分,如下所示:

{
"took": 1,
"timed_out": false,
"_shards":{
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits":{...}
}

检查失败碎片是否有0以外的值。如果是,请检查日志、集群和索引状态。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-身体搜索轨迹总命中

通常,如果不访问所有匹配项,就无法准确计算总命中数,这对于匹配大量文档的查询来说代价高昂。track_total_hits参数允许您控制如何跟踪总点击数。考虑到通常具有命中次数的下界就足够了;至少有10000次点击";,默认值设置为10000。这意味着请求将准确地统计总点击次数,最高可达10000次。如果你在某个阈值后不需要准确的点击次数,这是一个很好的折衷方案,可以加快搜索速度。

当设置为true时,搜索响应将始终跟踪准确匹配查询的命中数(例如,当track_total_hits设置为true后,total.relation将始终等于"eq"(。否则;合计关系";在";合计";搜索响应中的对象决定了";总值";应予以解释。值";gte";意味着";总值";是与查询匹配的总命中的下界;eq";表示";总值";是准确的计数。

len(res['hits']['hits'])将始终返回与items_per_page中指定的数字相同的数字(在您的情况下为12(,但最后一页可能返回小于或等于12的数字。

但是,res['hits']['total']['value']索引中的文档总数,而不是返回的结果数。如果文档数量增加,则意味着新文档在上次查询和当前查询之间建立了索引。

最新更新