ElasticSearch使用scrollId查询时InnerHit返回空白无法生效问题
解决方案
该问题为Elasticsearch中scroll查询结合inner_hits的典型场景,可按以下优先级排查修复:
检查初始scroll请求的inner_hits配置
发起第一次带scroll参数的查询时,必须在nested/父子关联查询中显式指定inner_hits的size参数,不可依赖默认值,参考配置如下:GET /<你的索引名>/_search?scroll=1m { "size": 100, "query": { "nested": { "path": "skus", "query": { "match": {"skus.color": "black"} }, "inner_hits": { "size": 100, // 此处必须显式声明大小 "from": 0 } } } }后续携带scroll_id的批次查询无需再重复写入查询条件和inner_hits配置,仅需传入scroll_id和scroll有效期即可。
确认Elasticsearch版本适配性
7.10之前的Elasticsearch版本存在已知bug:scroll查询第二批及以后的返回结果会丢失inner_hits内容。如果你的集群版本低于7.10,优先升级到7.10及以上版本即可解决该问题,无需调整其他业务配置。改用search_after分页方案(更推荐)
如果无法升级版本,可直接用search_after替代scroll实现深度分页,该方案天生不受10000条查询上限限制,也不存在inner_hits丢失的问题,更适合线上业务分页场景。示例用法如下:
第一次查询指定唯一排序字段(需用_id这类全局唯一字段作为最终排序条件):GET /<你的索引名>/_search { "size": 100, "query": { "nested": { "path": "skus", "query": {"match": {"skus.color": "black"}}, "inner_hits": {"size": 100} } }, "sort": [{"_id": "asc"}] }后续分页查询时,携带上一次返回结果最后一条的sort值作为search_after参数即可:
GET /<你的索引名>/_search { "size": 100, "query": { "nested": { "path": "skus", "query": {"match": {"skus.color": "black"}}, "inner_hits": {"size": 100} } }, "sort": [{"_id": "asc"}], "search_after": ["上一次返回结果最后一条的sort字段取值"] }
内容的提问来源于stack exchange,提问作者chiragchavda.ks
相关产品推荐
相关产品推荐

