{
"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]
Затем, как оценить такой запрос?
Я бы посоветовал вам взглянуть на ваши требования относительно повышения, поскольку ваш текущий script не имеет большого смысла.
Кроме того, посмотрите документацию по запросу elasticsearch DSL. Он предоставляет как сложные запросы, так и простые, которые вы можете комбинировать. Как говорится в ошибке, вы не можете поместить фильтр в пользовательский запрос оценки. Вы можете использовать отфильтрованный запрос в пользовательском запросе оценки:
{
"query": {
"custom_score": {
"query": {
"filtered" : {
"query" : {
"match": {
"xxx": {
"query": "foobar"
}
}
},
"filter" : {
"and": [
{
"query": {
"match": {
"yyyy": {
"query": "barfoo"
}
}
}
}
]
}
}
},
"script": "_score * doc['_score']"
}
}
}
или используйте верхний уровень filter следующим образом:
{
"query": {
"custom_score": {
"query": {
"match": {
"xxx": {
"query": "foobar"
}
}
},
"script": "_score * doc['_score']"
}
},
"filter": {
"and": [
{
"query": {
"match": {
"yyyy": {
"query": "barfoo"
}
}
}
}
]
}
}
Разница между двумя параметрами заключается в том, что фильтр верхнего уровня не учитывается, если вы делаете фасеты также в своем запросе на поиск, тогда как если вы поместите фильтры в запрос, они будут рассмотрены.
Еще одна вещь, на которую нужно обратить внимание: вам не нужен фильтр и фильтр, если у вас есть только одно предложение. Кроме того, обычно нет смысла размещать полнотекстовый поиск в фильтре, поскольку фильтры кэшируемы и при условии, что полнотекстовые поиски бесплатны и в значительной степени непредсказуемы, это было бы потерей для их кеширования.