gpt4 book ai didi

elasticsearch - 对嵌套数组中包含的两个值之间的差异进行过滤/排序(仅使用脚本过滤器和doc值)

转载 作者:行者123 更新时间:2023-12-03 01:47:29 27 4
gpt4 key购买 nike

用用例更容易说明我的问题,因此让我们从elasticsearch指南中获取example

这列出了产品。每个产品都有一个嵌套的阵列,其中包含销售所述产品的代理商:

    {
...

"product" : {
"properties" : {
"resellers" : {
"type" : "nested",
"properties" : {
"name" : { "type" : "text" },
"price" : { "type" : "double" }
}
}
}
}
}

如果有可能,我该怎么做?
  • 过滤所有storeA比storeB便宜的产品。例如:product.resellers[name=storeA].price < product.resellers[name=storeB].price
  • 通过商店A和商店B的价格差订购产品

  • 这可能分别需要一个脚本过滤器和一个订单过滤器,但是不确定我将如何处理。此外,这些查询类型经常使用,因此性能很重要。因此,我可能需要坚持使用docValues而不是使用 _source。这可能吗?

    最佳答案

    是的,这绝对有可能,您可以这样做:

    {
    "sort": {
    "_script": {
    "type": "number",
    "script": {
    "inline": "def store1 = _source.resellers.find{it.name == store1}; def store2 = _source.resellers.find{it.name == store2}; (store1 != null && store2 != null) ? store1.price - store2.price : 0",
    "lang": "groovy",
    "params": {
    "store1": "storeA",
    "store2": "storeB"
    }
    },
    "order": "asc"
    }
    },
    "query": {
    "bool": {
    "filter": [
    {
    "script": {
    "script": {
    "inline": "def store1 = _source.resellers.find{it.name == store1}; def store2 = _source.resellers.find{it.name == store2}; (store1 != null && store2 != null) ? store1.price < store2.price : false",
    "lang": "groovy",
    "params": {
    "store1": "storeA",
    "store2": "storeB"
    }
    }
    }
    }
    ]
    }
    }
    }

    排序脚本如下所示:
    def store1 = _source.resellers.find{it.name == store1}; 
    def store2 = _source.resellers.find{it.name == store2};
    (store1 != null && store2 != null) ? store1.price - store2.price : 0

    过滤器脚本有点类似,看起来像这样:
    def store1 = _source.resellers.find{it.name == store1}; 
    def store2 = _source.resellers.find{it.name == store2};
    (store1 != null && store2 != null) ? store1.price < store2.price : false

    这两个脚本在输入中均采用两个参数,即您要比较的经销商商店的名称。

    更新

    我以某种方式忘了解释为什么无法使用doc值来做到这一点。 Doc值实际上是倒排索引的倒数,即,将每个文档中存在的 token 映射到每个文档。再加上嵌套文档在索引中存储为独立(尚未隐藏)的文档的事实,文档的doc值如下所示
    {
    "id": 1,
    "product": "Water",
    "resellers": [
    {
    "name": "storeA",
    "price": 20
    },
    {
    "name": "storeB",
    "price": 30
    }
    ]
    }

    看起来像这样:
    Document        | Values
    ----------------+---------------------------
    1 (top-level) | water
    1a (1st nested} | storea, 20
    1b (2nd nested} | storeb, 30

    查看上表,由于脚本是在每个文档的上下文中执行的(无论是顶级文档还是嵌套文档),因此很明显,访问脚本中的doc值只会产生该文档的值,因此无法将它们与另一个文档中的值进行比较。

    当访问源时,我们有效地迭代了 resellers数组,因此可以在它们之间比较值并产生对您的上下文有用的东西。

    关于elasticsearch - 对嵌套数组中包含的两个值之间的差异进行过滤/排序(仅使用脚本过滤器和doc值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42817576/

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