_score при индексировании в elasticsearch

{ "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" } } } } ] } } 

Разница между двумя параметрами заключается в том, что фильтр верхнего уровня не учитывается, если вы делаете фасеты также в своем запросе поиска, а если вы поместите фильтры в запрос, то они будут рассмотрены.

Еще одна вещь, на которую нужно обратить внимание: вам не нужен фильтр и фильтр, если у вас есть только одно предложение. Кроме того, обычно не имеет смысла размещать полнотекстовый поиск в фильтре, поскольку фильтры кэшируемы и при условии, что полнотекстовые поиски бесплатны и в значительной степени непредсказуемы, это было бы потерей для их кэширования.