基于对象数组的弹性搜索过滤器



下面是我有的映射

{
"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类型,你可能会遇到意想不到的结果,就像这里和这里解释的那样。

相关内容

  • 没有找到相关文章

最新更新