首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用嵌套查询多父文档_score和来自function_score的_score

使用嵌套查询多父文档_score和来自function_score的_score
EN

Stack Overflow用户
提问于 2016-12-29 09:16:38
回答 2查看 898关注 0票数 1

我想要的是获取与标题字段中的查询字段匹配的所有文档,如果查询字词也与嵌套字段完全匹配,则通过嵌套对象中字段的值提高分数。

下面是我的示例文档:

代码语言:javascript
复制
{
  "Title": "The Heart of the Elastic Stack"
  "QueryClicks": [
      { "Term": "elastic stack", "Count": 100},
      { "Term": "elastic", "Count": 50},
      { "Term": "hard of the elastic", "Count": 200},
  ]
}

和示例查询DSL:

代码语言:javascript
复制
{
  "query" : {
    "bool" : {
      "must" : [{
          "match" : {
            "Title" : "elastic stack"
          }
        }
      ],
      "should" : [{
          "nested" : {
            "path" : "QueryClicks",
            "query" : {
              "function_score" : {
                "query" : {
                  "match" : {
                    "QueryClicks.Term.lowercaseraw" : "elastic stack"
                  }
                },
                "functions" : [{
                    "script_score" : {
                      "script" : "log(doc['QueryClicks.Count'].value*4)"
                    }
                  }
                ],
                "boost_mode" : "replace"
              }
            }
          }
        }
      ]
    }
  }
}

它以某种方式工作,对于某些查询术语,如果它匹配其中一个QueryClicks.Term,则额外的分数将被添加到文档的整个分数中。

但这并不完美,我想要的是将嵌套函数的分数(即log(doc'QueryClicks.Count'.value*4) )与父文档的分数相乘,该分数在must子句中计算。

如果我可以得到父文档的分数,那么我可以这样做:

"script":“日志(doc‘QueryClicks.Count’.value*4)* _parent_score”

但由于ES还不支持从嵌套查询中获取父级分数。还有其他方法吗?

其目的是将QueryClicks.Count计算出的_score与_score from查询子句相乘。

EN

回答 2

Stack Overflow用户

发布于 2016-12-29 17:24:15

您已使用boost_mode作为替换。这将忽略查询生成的分数。您当前的函数分数设置将仅用该score of function查询替换文档的分数。

要将函数查询的分数与查询生成的分数相乘,请使用以下查询

代码语言:javascript
复制
{
    "query": {
        "bool": {
            "must": [{
                "match": {
                    "Title": "elastic stack"
                }
            }],
            "should": [{
                "nested": {
                    "path": "QueryClicks",
                    "query": {
                        "function_score": {
                            "query": {
                                "match": {
                                    "QueryClicks.Term.lowercaseraw": "elastic stack"
                                }
                            },
                            "functions": [{
                                "script_score": {
                                    "script": "log(doc['QueryClicks.Count'].value*4)"
                                }
                            }],
                            "boost_mode": "multiply",
                            "score_mode": "sum"
                        }
                    }
                }
            }]
        }
    }
}

在这里,您可以相应地替换score_mode,以便为函数中的每个分数计算函数分数。

希望这对你有用。谢谢

票数 1
EN

Stack Overflow用户

发布于 2017-01-06 14:55:39

谢谢。我在之前的评论中没有清楚地回答你的问题。我试着用更多细节来解释。您说得对,score_mode用于组合函数数组内所有函数的查询分数,boost_mode用于组合函数的分数和查询分数

我想要的是:

  1. 将父单据的分数与嵌套单据的分数相乘。
  2. 父单据分数来自{match:{"Title":"elastic stack“}}中的必须子句。
  3. 嵌套单据字段QueryClicks.Count计算嵌套单据分数,在子句中嵌套查询中包装在function_score中。

因此,在我最初的查询DSL中,我将boost_mode设置为替换“,因为在子句中我想要的分数实际上是来自以下脚本的分数:

代码语言:javascript
复制
"script": "log(doc['QueryClicks.Count'].value*4)"

但是因为它在score 子句中,所以它将被添加到score from must子句中。正如我所说的,我希望它乘以必须子句的分数。

如果按照您的建议将"boost_mode"更改为"multiply“,则脚本分数将与嵌套匹配的分数相乘:"match":{"QueryClicks.Term.lowercaseraw":"elastic stack"}

以上script_score的关联查询("match":{"QueryClicks.Term.lowercaseraw":"elastic stack"})只是使用脚本分值的前提条件。

然后,此分数将被添加到来自的分数必须子句。这不是我想要的。

希望这能帮助你理解我的要求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41371952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档