Elasticsearch按嵌套字段links的长度排序问题求助
解决Elasticsearch按Nested字段长度排序的问题
你遇到的问题核心在于nested类型字段的访问方式不对,同时脚本的type设置也有误。我来一步步帮你解决:
错误原因分析
Elasticsearch的nested类型会把每个嵌套对象当作独立的子文档存储,所以你直接用doc['links']去访问是找不到这个字段的——这就是你看到报错的原因。另外,你把排序的type设为string也不对,因为数组长度是整数类型,这也会导致排序逻辑异常。
解决方案一:通过params._source直接获取数组长度(快速实现)
利用文档的原始_source数据来获取links数组的长度,同时处理links为null的情况避免空指针:
{ "sort": { "_script": { "script": "params._source.links != null ? params._source.links.length : 0", "order": "desc", "type": "integer" } } }
这个方法不需要修改索引映射,适合快速验证需求,但要注意:_source访问的性能比doc lookup稍差,如果你的数据量很大或者需要频繁执行这个排序,建议用下面的方法。
解决方案二:新增字段存储长度(高性能方案)
新增一个专门的字段links_count来存储links数组的长度,后续直接按这个字段排序,性能会更好:
- 更新索引映射,添加
links_count字段:
{ "mappings": { "product": { "properties": { "links": { "type": "nested" }, "links_count": { "type": "integer" } } } } }
- 批量更新现有文档,填充
links_count的值:
POST product/_update_by_query { "script": { "source": "ctx._source.links_count = ctx._source.links != null ? ctx._source.links.length : 0" } }
- 直接按
links_count排序:
{ "sort": [{"links_count": {"order": "desc"}}] }
后续在索引新文档时,记得同步设置links_count的值,比如在写入前计算好数组长度再传入。
内容的提问来源于stack exchange,提问作者soia019192
相关产品推荐
相关产品推荐

