在 Mapping 里面,将 dynamic 参数设置成 strict 可以拒绝索引包含未知字段的文档。 此条 Tips 由 medcl 贡献。

ES中的terminate_after参数与sort参数的查询顺序

Elasticsearch | 作者 NewBee | 发布于2022年08月08日 | 阅读数:1934

在查询数据时,由于索引内的数据量过大,所以使用了terminate_after参数来限制每个分片的查询数量,但是这导致在按时间排序的时候查到数据的时间范围比查询时设的时间范围要小,所以terminate_after参数是先在每个分片随机查询预设的数量之后再进行排序么,还是按时间范围查询,只是人为截断导致的,请问这个问题有办法避免吗
已邀请:

Charele - Cisco4321

赞同来自:

"但是这导致在按时间排序的时候查到数据的时间范围比查询时设的时间范围要小"
 
没明白你的意思,你加了terminate_after后,只是返回的文档数量会变少了,
应该不会出现逻辑上的错误吧。
比如你要找1985-1989之间的,难道它会返加1981的数据?

amc - tbd

赞同来自:

"所以terminate_after参数是先在每个分片随机查询预设的数量之后再进行排序么,还是按时间范围查询,只是人为截断导致的"

按照query条件,先收集文档,然后截断,再进行排序,保证返回数据符合查询要求,但不保证排序的顺序与全量数据查询时的排序一致
 
"请问这个问题有办法避免吗"
 
如果需要避免,可以试试预排序(index sorting),让收集文档的过程和你的排序一致,就避免了先收集再排序导致的问题
同时预排序后自带提前结束的功能,可以对比下添加terminate_after和不添加时的性能差距
不过预排序会导致写入压力增加,好处是查询快很多
 terminate_after

(Optional, integer) Maximum number of documents to collect for each shard. If a query reaches this limit, Elasticsearch terminates the query early. Elasticsearch collects documents before sorting.
 
https://www.elastic.co/guide/e ... .html
 
https://www.elastic.co/guide/e ... .html

要回复问题请先登录注册