Elasticsearch7.13按full_text.title长度排序返回值仅为7问题排查
问题原因
- 核心原因是你通过
doc['full_text.title'].value取到的不是原始完整的标题文本:text类型字段开启fielddata后,doc值中存储的是分词器拆分后的独立词条列表,调用.value只会返回列表中的单个词条(默认取字典序排序的第一个词条),你得到的7.0就是这个词条的字符长度,和完整标题长度无关。 - 额外注意:你的
full_text是对象数组结构,即使字段未分词,直接通过doc取值也会存在数组元素拍平后取值异常的问题。
修复方案
方案1:调整mapping新增keyword子字段(推荐,性能最优)
首先修改索引mapping,给full_text.title新增keyword类型子字段,存储完整的原始标题文本:
{ "full_text" : { "properties" : { "title" : { "type" : "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 1024 // 按你的标题最大长度调整即可 } } } } } }
修改mapping后重建索引写入数据,再调整排序DSL如下:
"sort": { "_script": { "type": "number", "order": "desc", "script": { "lang": "painless", "source": "doc['full_text.title.keyword'].value.length()" } } }
方案2:直接读取_source取值(无需改mapping,性能较差)
如果不想修改重建索引,可以直接从原始文档_source中取标题计算长度,适合数据量较小的查询场景:
"sort": { "_script": { "type": "number", "order": "desc", "script": { "lang": "painless", "source": "params._source.full_text[0].title.length()" // 如果需要处理full_text数组有多个元素的场景,可以自行扩展遍历逻辑 } } }
内容的提问来源于stack exchange,提问作者Quang Hà Đặng
相关产品推荐
相关产品推荐

