gpt4 book ai didi

elasticsearch - 如何在嵌套对象中添加根对象的属性以进行排序?

转载 作者:行者123 更新时间:2023-12-02 22:32:10 26 4
gpt4 key购买 nike

我们索引中的文档类型的简化示例:

{ 
"organisation" : {
"code" : "01310"
},
"publications" : [
{
"dateEnd" : 1393801200000,
"dateStart" : 1391986800000,
"code" : "PUB.02"
},
{
"dateEnd" : 1401055200000,
"dateStart" : 1397512800000,
"code" : "PUB.06"
}
]
}

请注意 publications映射为 nested对象,因为我们需要根据 dateEnd 的组合进行过滤, dateStartpublicationStatus特性。
PUB.02状态码是特殊的。它指出:“如果当前用户是该组织的成员,则此发布期限有效”。

当我想按“最近”排序时遇到问题:
{
"sort": {
"publications.dateStart" : {
"mode" : "min",
"order" : "desc",
"nested_filter" : {
"or" : [
{
"and" : [
{ "term" : { "organisation.code" : "01310" } },
{ "term" : { "publications.code" : "PUB.02" } }
]
},
{ "term" : { "publications.code" : "PUB.06" } }
]
}
}
}
}

没有给出错误,但 PUB.02条目被忽略。我尝试使用 copy_to在我的映射中复制 organisation.code 的值到 nested反对,但这并没有帮助。
  • 有没有办法在嵌套排序中找到父文档?
  • 或者,有没有办法将数据从父级复制到嵌套文档?

  • 我目前正在使用 1.7 版的 Elasticsearch,但无法使用脚本。如果这对情况有所帮助,可以升级到较新的版本。

    这个要点表明排序是在 PUB.06 上执行的。出版物: https://gist.github.com/EECOLOR/2db9a1ec9d6d5c791ea6

    最佳答案

    尽管文档没有明确提及,但看起来我们无法在嵌套过滤器上下文中访问父字段。

    我也无法使用 copy_to将数据从根/父字段添加到嵌套文档。我建议在 elasticsearch discuss thread 中询问你会有更多的运气来了解这个原因。

    在一些触发快乐的家伙否决这个答案之前,我想补充一点,使用 sort 在 OP 中所需的查询和预期结果可以使用 function_score 来实现变通方法。

    实现此目的的一种实现方式如下

    1) 从应该查询开始

    2) 在第一个 should 子句中

     a) use filtered query  to filter documents with the `organisation.code : 01310`

    b) then score these documents based on max value of reciprocal of nested document **dateStart** with terms **PUB2.0 PUB6.0**

    3) 在第二个 should 子句中
     a) use filtered query  to filter documents with those with `organisation.code not equal to  01310`

    b) like before score these documents based on max value of reciprocal of nested document **dateStart** with term **PUB6.0** only

    示例查询:
    POST /testindex/testtype/_search 
    {
    "query": {
    "bool": {
    "should": [
    {
    "filtered": {
    "filter": {
    "term": {
    "organisation.code": "01310"
    }
    },
    "query": {
    "nested": {
    "path": "publications",
    "query": {
    "filtered": {
    "query": {
    "function_score": {
    "functions": [
    {
    "field_value_factor": {
    "field": "publications.dateStart",
    "modifier": "reciprocal"
    }
    }
    ],
    "boost_mode": "replace",
    "score_mode": "max"
    }
    },
    "filter": {
    "terms": {
    "publications.code": [
    "PUB.02",
    "PUB.06"
    ]
    }
    }
    }
    },
    "score_mode": "max"
    }
    }
    }
    },
    {
    "filtered": {
    "filter": {
    "not": {
    "term": {
    "organisation.code": "01310"
    }
    }
    },
    "query": {
    "nested": {
    "path": "publications",
    "query": {
    "filtered": {
    "query": {
    "function_score": {
    "functions": [
    {
    "field_value_factor": {
    "field": "publications.dateStart",
    "modifier": "reciprocal"
    }
    }
    ],
    "boost_mode": "replace",
    "score_mode": "max"
    }
    },
    "filter": {
    "terms": {
    "publications.code": [
    "PUB.06"
    ]
    }
    }
    }
    },
    "score_mode": "max"
    }
    }
    }
    }
    ]
    }
    }
    }

    我首先承认它不是最易读的,如果有办法“copy_to”嵌套它会更理想

    如果不模拟 copy_to通过在索引之前由客户端在源中注入(inject)数据会更加简单和灵活。

    但以上是如何使用功能分数完成的示例。

    关于elasticsearch - 如何在嵌套对象中添加根对象的属性以进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33618467/

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