一尘不染

需要在elasticsearch中对_term进行排序

elasticsearch

我有一个索引器,其中包含一个名为“
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等

如果有人可以研究并提供帮助,那将是一个很大的帮助。

谢谢..


阅读 653

收藏
2020-06-22

共1个答案

一尘不染

这是因为您正在对字符串进行排序,并且字符串的词法顺序与这些字符串所表示的数字顺序不同。

对于字符串:“11”来 之前, “2”,因为“1”是之前“2”

对于数字:11 明显排 2 之后

解决方案是将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}'

更新

如果 不选择 更改映射,则可以scriptterms聚合中使用a
将字符串术语转换为数字,以及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
      }
    }
  }
}
2020-06-22