【问题标题】:Fetch other document value while framing DSL query在构建 DSL 查询时获取其他文档值
【发布时间】:2022-01-26 10:31:45
【问题描述】:

我将 script_score 添加到我的 DSL 查询中,以根据源产品的价格提升结果。像这样:

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

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

应该有某种方法可以使用无痛脚本来获取 id 的值,但我无法获取它。如果有人可以在这方面提供帮助,那就太好了。 蒂亚!

【问题讨论】:

  • 很遗憾,无法在脚本中按 id 查找文档。
  • 哦! :( 有没有其他更好的方法来实现这一点?
  • 你能分享一下你为了计算出 1000 的值而进行的第一个查询吗?
  • 这只是带有该源文档 ID 的 mget 请求。 GET /_doc/100

标签: elasticsearch elasticsearch-dsl relevance


【解决方案1】:

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

假设您有一个价格索引,即您第一次从哪里获取应该提高价格的文档。

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"
              }
            }
          }
        }
      ]
    }
  }
}

我希望这能解决你的问题。

【讨论】:

  • 太棒了。非常感谢 Val,将检查此选项。
  • 我无法选中此选项,但看起来它会起作用。所以,接受答案。这可能会对某人有所帮助。
  • 酷,很高兴它有帮助!一旦您有机会对此进行测试,请随时返回。
猜你喜欢
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多