在构造 DSL 查询时获取其他文档值

Fetch other document value while framing DSL query

我正在向我的 DSL 查询添加 script_score,以根据源产品的价格提高结果。像这样:

functions":[
            {
               "script_score":{
                  "script":"if (doc['price'].size() > 0 && doc['price'].value == 1000.0) {15}"
               }
            }
         ],

此处“1000.0”是不属于响应的一份文件的价格。为此,我必须查询 2 次,首先获取该文档的价格,然后构建查询并将价格添加到查询并提升结果,这会导致性能下降。

应该有一些方法可以使用无痛脚本来获取 id 的值,但我无法获取它。如果有人可以提供帮助,那就太好了。 TIA!

其实是有办法的。我已尝试在下面重现您的案例,希望它与您所拥有的足够接近。

比如说,你有一个价格指数,即从你第一次获取价格应该提高的文件的地方。

PUT prices/_doc/1
{
  "price": 1000
}

然后,您的主索引是包含运行第二个查询的文档的索引,假设它是针对产品的,我们有一个产品的价格为 1000,另一个产品的价格为 500。

PUT products/_doc/q
{
  "name": "product q",
  "price": 1000
}

PUT products/_doc/2
{
  "name": "product 2",
  "price": 500
}

现在,查询将如下所示。在 function_score 查询中,我们将价格与价格索引中 ID 为 1 的文档的价格相匹配的文档提高 15(即脚本中的硬编码值)。 terms lookup query 将从指定文档(即 ID 为 1)中获取 1000 的 price,然后将权重为 15 的具有该价格的文档提升。

GET products/_search
{
  "query": {
    "function_score": {
      "functions": [
        {
          "weight": 15,
          "filter": {
            "terms": {
              "price": {
                "index": "prices",
                "id": "1",
                "path": "price"
              }
            }
          }
        }
      ]
    }
  }
}

希望这能解决您的问题。