{
"query": {
"custom_score": {
"query": {
"match": {
"xxx": {
"query": "foobar"
}
}
},
"filter": {
"and": [
{
"query": {
"match": {
"yyyy": {
"query": "barfoo"
}
}
}
}
]
}
},
"script": "_score * doc['_score']"
}
}
这会产生错误
[custom_score] query does not support [filter]
那么如何评估这样的查询呢?
我建议你看看你对提升的要求,因为你目前的脚本没有多大意义。
另外,请查看弹性搜索查询DSL的文档。它提供复合查询和简单查询,您可以将它们组合在一起。正如错误所述,您无法在自定义分数查询中放置筛选器。您可以在自定义分数查询中使用筛选的查询:
{
"query": {
"custom_score": {
"query": {
"filtered" : {
"query" : {
"match": {
"xxx": {
"query": "foobar"
}
}
},
"filter" : {
"and": [
{
"query": {
"match": {
"yyyy": {
"query": "barfoo"
}
}
}
}
]
}
}
},
"script": "_score * doc['_score']"
}
}
}
或者使用如下所示的顶级筛选器:
{
"query": {
"custom_score": {
"query": {
"match": {
"xxx": {
"query": "foobar"
}
}
},
"script": "_score * doc['_score']"
}
},
"filter": {
"and": [
{
"query": {
"match": {
"yyyy": {
"query": "barfoo"
}
}
}
}
]
}
}
这两个选项之间的区别在于,如果您在搜索请求中也进行了分面,则不考虑顶级筛选器,而如果您将筛选器放在查询中,则会考虑它们。
还有一件事要看:如果你只有一个子句,你不需要 and 过滤器。此外,将全文搜索放在过滤器中通常没有意义,因为过滤器是可缓存的,并且鉴于全文搜索是免费的并且几乎不可预测,缓存它们将是一种浪费。