下面是我有的映射
{
"defaultBoostValue":1.01,
"boostDetails": [
{
"Type": "Type1",
"value": 1.0001
},
{
"Type": "Type2",
"value": 1.002
},
{
"Type": "Type3",
"value": 1.0005
}
]
}
我想根据类型应用boostType,所以如果boostType是Type3,那么boostFactor应该是1.0005,并且如果它没有那个boostType,它应该应用"boostType";defaultBoostValue";作为助推下面是我尝试的查询
{
"query": {
"function_score": {
"boost_mode": "multiply",
"functions": [
{
"filter": {
"match": {
"boostDetails.Type": "Type1"
}
},
"field_value_factor": {
"field": "boostDetails.value",
"factor": 1,
"missing": 1
}
}
]
}
}
}
它并没有像预期的那样工作,因为boostDetails是对象的数组,我们如何在这种情况下应用过滤器
您可以使用Script Scorefunction_score
查询
{
"query": {
"function_score": {
"boost_mode": "multiply",
"functions": [
{
"filter": {
"match": {
"boostDetails.Type": "Type1"
}
},
"script_score": {
"script": {
"source": """
double findBoost(Map params_copy) {
for (def group : params_copy._source.boostDetails) {
if (group['Type'] == params_copy.preferredBoostType ) {
return group['value'];
}
}
return params_copy._source['defaultBoostValue'];
}
return findBoost(params)
""",
"params": {
"preferredBoostType": "Type1"
}
}
}
}
]
}
}
}
但请记住,如果给定文档中不存在此特定的提升类型(Type1
(,则function_score
查询的filter
将阻止此脚本激活->CCD_ 5根本不会被默认为。
因此,我建议使用match_all
过滤器,当然也要保留preferredBoostType
:
{
"query": {
"function_score": {
"boost_mode": "multiply",
"functions": [
{
"filter": {
"match_all": {} <---
},
"script_score": {
"script": {
"source": """
...
""",
"params": {
"preferredBoostType": "Type1"
}
}
}
}
]
}
}
}
顺便说一句,如果你的boostDetails
数组不是nested
类型,你可能会遇到意想不到的结果,就像这里和这里解释的那样。