当前位置: 首页 > 面试题库 >

需要在elasticsearch中对_term进行排序

徐鸿文
2023-03-14
问题内容

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


 类似资料:
  • 问题内容: 根据上述问题,我用Val给定的脚本进行的elasticsearch查询在最后一周之前都可以正常工作。我们已经升级了ES版本,但突然停止了工作。 现在突然我的ES停止使用脚本中包含“ as Integer”的代码。任何人都可以检查和帮助。 我尝试了给定的查询,现在它抛出以下异常。 我作为参数传递的查询是: 由于我的索引器在该字段中包含1、2、4、6、14个值。但是执行完此查询后,我只得到

  • 问题内容: 我正在使用以下映射: 文件范例: 我的问题是如何检索此文档并按“日期”对嵌套对象“注释”进行排序?结果: 问题答案: 您需要在inner_hits上对进行排序。这将为您提供所需的输出 我使用的源过滤得到的只有作为将被检索里面,但你能避免,如果你想 是5,因为默认值为3,并且在给定的示例中我们有4个对象。 希望这可以帮助!

  • 问题内容: 我在使用Elasticsearch查询时遇到问题。我希望能够对结果进行排序,但是elasticsearch忽略了排序标签。这是我的查询: 但是,当我删除查询部分并仅发送排序标签时,它就可以工作。谁能指出正确的方法? 我还尝试了以下查询,这是我所拥有的完整查询: 设定值 对应 提前致谢! 问题答案: 文档中的 “标题” 字段是一个 分析的 字符串字段,也是一个多值字段,这意味着Elast

  • 问题内容: 可以说我有以下映射: 然后,我对父文档进行“ _geo_distance”排序,并能够对“ site.point”上的文档进行排序。但是,我还希望嵌套位置在父文档中按“ _geo_distance”排序。 这可能吗?如果是这样,怎么办? 问题答案: 不幸的是,没有(至少现在还没有)。 ElasticSearch中的查询仅标识与该查询匹配的文档以及它们的匹配程度。 要了解嵌套文档的用途,

  • 代码: 产出:4 1 [代码连结][1] 前缀运算符的优先级高于逻辑运算符。2.逻辑<代码> 怀疑: > 为什么这里不遵循第一条规则?这不应该是正确的吗? 因此,在printf语句中,的值变为5。 为什么这里违反了一般的优先规则?当两个运算符的优先级相同时,关联性开始起作用。编译器不应该首先查看是计算还是

  • 问题内容: 例如具有以下代码: 我如何排序此json这样- 我用ID对用户进行了排序。. 我不知道如何在javascript中执行此操作。 问题答案: 首先,这 不是 JSON。这是一个JavaScript对象文字。JSON是数据的 字符串表示 形式,它恰好非常类似于JavaScript语法。 其次,您有一个对象。他们没有排序。不能保证元素的顺序。如果要保证顺序,则 需要 使用数组。这将需要您更改