gpt4 book ai didi

elasticsearch - 在排序之前映射字段的值

转载 作者:行者123 更新时间:2023-12-03 01:46:17 25 4
gpt4 key购买 nike

我想使用具有以下值的customer_priority字段在ElasticSearch中对数据进行排序:IMMEDIATEHIGHMEDIUMLOW

由于排序是按字母顺序进行的,因此我得到了以下不希望有的排序:HIGHIMMEDIATELOWMEDIUM。但我想:LOWMEDIUMHIGHIMMEDIATE

如何指示ElasticSearch以任意方式排序?

我调查了一些事情:

  • 我看到您在查询中放入了一种叫做custom scoring functions的东西,但这实际上是要走的路吗?我想要可以放入映射而不是查询的内容。
  • 更改实际的存储值,以便它是一个数字而不是字符串:我想暂时避免这种情况,这需要对我们的系统进行很大的更改。

  • 顺便说一句:我正在使用ES 2.3

    最佳答案

    脚本库排序是主要的选择,但是它有一些缺点。请参阅this documentation for how to sort with a script(我假设您当前正在使用最新的ES版本5.3)。

    您将为您的案例添加以下内容:

    "sort" : {
    "_script" : {
    "type" : "number",
    "script" : {
    "lang": "painless",
    "inline": "def val = doc['customer_priority'].value;
    if (val == 'LOW') { return 0;}
    if (val == 'MEDIUM') {return 1;}
    if (val == 'HIGH') {return 2;}
    if (val == 'IMPORTANT') {return 3;}"
    },
    "order" : "asc"
    }
    }

    注意:我没有测试此代码示例。

    缺点是您需要在映射中为此字段 customer_priority启用字段数据,这将增加内存需求。默认情况下未启用。但是幸运的是,该字段的基数很小(只有4个值),因此开销很小。另一个缺点是脚本排序很慢,因为脚本需要在每个文档上运行。

    另一种选择是通过添加一个 customer_priority的数字字段来进一步规范化 customer_priority_sort,该字段的值为1、2、3或4并映射到 LOWMEDIUMHIGHIMPORTANT,以便您可以对该值进行排序而不是字符串。

    如果必须更改这些字段,则必须保持同步,这是额外的开销,但您可能会对结果更满意,并且将朝着只为这些枚举值存储整数(而不是直接存储字符串)的方向迈进,这反过来会提高磁盘使用效率。

    编辑:对于ES 2.3,groovy是首选的脚本语言,因此您可能必须更新上面的 Painless代码示例,但是方法是相同的。在2.3和5.3中同样支持基于脚本的排序,请参见 the docs

    关于elasticsearch - 在排序之前映射字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724354/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com