{ "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-запроса elasticsearch. Он предоставляет как сложные запросы, так и простые, которые вы можете комбинировать. Как говорится в ошибке, вы не можете поместить фильтр в пользовательский запрос оценки. Вы можете использовать отфильтрованный запрос внутри пользовательского запроса оценки:
{ "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" } } } } ] } }
Разница между двумя параметрами заключается в том, что фильтр верхнего уровня не учитывается, если вы делаете фасеты также в своем запросе поиска, а если вы поместите фильтры в запрос, то они будут рассмотрены.
Еще одна вещь, на которую нужно обратить внимание: вам не нужен фильтр и фильтр, если у вас есть только одно предложение. Кроме того, обычно не имеет смысла размещать полнотекстовый поиск в фильтре, поскольку фильтры кэшируемы и при условии, что полнотекстовые поиски бесплатны и в значительной степени непредсказуемы, это было бы потерей для их кэширования.