我有一个Indexer,其中包含一个名为“billingSequence”的字段。映射中字段的数据类型为String,此字段的每个记录的值可以是1到30之间的值。我在术语聚合中使用此字段 当我尝试对_terms进行排序时,排序是不正确的,因为该字段是String类型。
{
"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等。
如果有人可以调查并提供帮助,那将是一个很大的帮助。
谢谢..
答案 0 :(得分:4)
那是因为你正在排序字符串,而字符串的词汇顺序与这些字符串所代表的数字的顺序不同。
对于字符串:“11”在“2”之前,因为“1”在“2”之前
对于数字:11显然>> 。
解决方案是将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
将字符串字词转换为数字以及未记录的字符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
}
}
}
}