【问题标题】:ElasticSearch: Sort document based on combination of parent nested fieldsElasticSearch:根据父嵌套字段的组合对文档进行排序
【发布时间】:2016-04-15 04:06:18
【问题描述】:

我正在尝试通过将根文档中的数字字段与嵌套文档中的字段组合来对 ES 文档进行排序。为简单起见,假设我想对 doc['score'] + doc['nested.score'] 进行排序。

示例映射和几个数据文档在这里:http://pastebin.com/9sdMphsR

因为它试图直接访问doc['score'],所以一种天真的(也是错误的)方法是:

POST /testing/stuff/_search
{
    "query": {
        "match_all": {
        }
    },
    "sort": {
        "_script": {
            "type": "number",
            "mode": "max",
            "script": {
                "inline": "doc['score'].value + doc['variations.score'].value",
                "lang": "expression"
            },
            "order": "desc",
            "nested_path": "variations"
        }
    }
}

这样做的正确方法是什么?我意识到我可以将根级 score 复制到每个嵌套文档中,但如果我可以避免这样做,我更愿意这样做。

【问题讨论】:

    标签: elasticsearch elasticsearch-2.0


    【解决方案1】:
    POST /testing/stuff/_search
    {
      "query": {
        "match_all": {}
      },
      "sort": {
        "_script": {
          "type": "number",
          "script": {
            "inline": "def max=java.lang.Integer.MIN_VALUE; for(obj in doc['variations.score']){ if (obj > max) max = obj; }; return doc['score'].value + max",
            "lang": "groovy"
          },
          "order": "desc"
        }
      }
    }
    

    并且variations 字段需要有"include_in_parent": true 以便脚本能够访问嵌套值。

    【讨论】:

    • 感谢您的帮助!但这似乎对我不起作用。当我尝试此操作时(将max 更改为浮点数而不是整数),max 始终计算为 0,并且返回值只是父级的scorevariations 是嵌套数据类型,而不是简单字段。
    • 这是什么ES版本?
    • 我目前正在运行 2.2 版
    • 哦,我忘了说:variations 需要有 "include_in_parent": true 否则我看不到访问嵌套对象值的方法。
    • 啊,是的,我意识到在父对象中复制数据是一种选择,我希望有一个不需要复制数据的解决方案。
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多