需要在弹性搜索中对_term进行排序

时间:2015-10-06 11:57:54

标签: elasticsearch

我有一个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等。

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

谢谢..

1 个答案:

答案 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
      }
    }
  }
}