我有一个索引器,其中包含一个名为“ billingSequence”的字段。映射中该字段的数据类型为String,并且该字段的每个记录的值可以是1到30之间的一个。我使用此字段进行聚合,并且在尝试对_terms进行排序时,该字段的排序不正确是字符串类型。
{ "aggs": { "count": { "terms": { "field": "billingSequence" , "order" : { "_term" : "asc" } } } } }
上述聚合排序的结果是-1 11 12 13 14 15 16 17 18 19 2 3 4 5等。
预期结果是-1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16等
如果有人可以研究并提供帮助,那将是一个很大的帮助。
谢谢..
这是因为您正在对字符串进行排序,并且字符串的词法顺序与这些字符串所表示的数字顺序不同。
对于字符串:“11”来 之前, “2”,因为“1”是之前“2”
对于数字:11 明显排 在 2 之后 。
解决方案是将billingSequence字段映射为整数而不是字符串。
billingSequence
{ "billingSequence": { "type": "integer" } }
请注意,您需要首先擦除索引(1),重新创建索引并安装上述映射(2),最后重新索引数据(3)。然后您的聚合将按预期工作。
(1)
curl -XDELETE localhost:9200/your_index
(2)
curl -XPUT localhost:9200/your_index -d '{ "mappings": { "your_type": { "properties": { "billingSequence": { "type": "integer" } } } } }
(3)
curl -XPOST localhost:9200/your_index/your_type/1 -d '{"billingSequence": 1}' curl -XPOST localhost:9200/your_index/your_type/2 -d '{"billingSequence": 2}' curl -XPOST localhost:9200/your_index/your_type/3 -d '{"billingSequence": 3}'
更新
如果 不选择 更改映射,则可以script在terms聚合中使用a 将字符串术语转换为数字,以及terms聚合的未记录功能,即value_type设置,如下所示:
script
terms
value_type
{ "size": 0, "aggs": { "count": { "terms": { "script": "doc.billingSequence.value as Integer", <--- transform the terms to integers "order": { "_term": "asc" }, "value_type": "integer", <--- consider the terms as integer when sorting "size": 10 } } } }