Elasticsearch查询中数组值与数组长度不匹配问题
问题分析:Elasticsearch数组长度计算不匹配
执行的查询语句
GET my_index/_search { "_source": ["file_types", "link_to_file"], "query": { "bool": { "filter": [ { "term": { "_id": "45t8724b811b590d54cc1925166a9cb5" } } ] } }, "script_fields": { "file_types_len": { "script": "doc['file_types'].length" }, "link_to_file_len": { "script": "doc['link_to_file'].length" } } }
查询结果
{ "_index": "my_index-150522", "_type": "_doc", "_id": "45t8724b811b590d54cc1925166a9cb5", "_score": 0.0, "_source": { "link_to_file": [ "https://bucket.s3.amazonaws.com/abc123", "https://bucket.s3.amazonaws.com/wer134" ], "file_types": ["jpeg", "jpeg"] }, "fields": { "file_types_len": [1], "link_to_file_len": [2] } }
原因解释
doc['field'].length获取的是倒排索引中该字段的去重词项数量,而非原始数组的元素个数:
file_types数组的两个元素都是jpeg,倒排索引会对重复值去重,仅保留1个词项,因此计算出的长度为1。link_to_file数组的两个URL是不同值,倒排索引保留了2个独立词项,所以计算长度为2。
解决方法
要获取原始数组的真实长度,需直接读取原始文档的字段值进行计算,修改script_fields中的脚本为:
"script_fields": { "file_types_len": { "script": "params._source.file_types.length" }, "link_to_file_len": { "script": "params._source.link_to_file.length" } }
内容的提问来源于stack exchange,提问作者bodha
相关产品推荐
相关产品推荐

