我想要的是获取与标题字段中的查询字段匹配的所有文档,如果查询字词也与嵌套字段完全匹配,则通过嵌套对象中字段的值提高分数。
下面是我的示例文档:
{
"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:
{
"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查询子句相乘。
发布于 2016-12-29 17:24:15
您已使用boost_mode作为替换。这将忽略查询生成的分数。您当前的函数分数设置将仅用该score of function查询替换文档的分数。
要将函数查询的分数与查询生成的分数相乘,请使用以下查询
{
"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,以便为函数中的每个分数计算函数分数。
希望这对你有用。谢谢
发布于 2017-01-06 14:55:39
谢谢。我在之前的评论中没有清楚地回答你的问题。我试着用更多细节来解释。您说得对,score_mode用于组合函数数组内所有函数的查询分数,boost_mode用于组合函数的分数和查询分数。
我想要的是:
因此,在我最初的查询DSL中,我将boost_mode设置为替换“”,因为在子句中我想要的分数实际上是来自以下脚本的分数:
"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"})只是使用脚本分值的前提条件。
然后,此分数将被添加到来自的分数必须子句。这不是我想要的。
希望这能帮助你理解我的要求。
https://stackoverflow.com/questions/41371952
复制相似问题