Elasticsearch: оптимизировать запрос с помощью фильтра и constant_score? - PullRequest
0 голосов
/ 07 февраля 2019

В руководстве по Udemy я наткнулся на этот запрос:

{ "query": { "bool": {
    "must": {"match": {"genre": "Sci-Fi"}},
    "must_not": {"match": {"title": "trek"}},
    "filter:" {"range": {"year": {"gte": 2010, "lt": 2015}}}
}}}

Мне было интересно, можно ли его оптимизировать?Я думаю о двух возможных путях:

  1. Помещение «жанра» в контекст фильтра.Но фильм может быть нескольких жанров, поэтому я не уверен, будет ли работать с ключевым словом type и filter-term.

  2. Помещение «must_not» в контекст фильтра напрямую (безbool) не будет работать, потому что фильтры, насколько я понимаю, не позволяют «отфильтровывать», только «фильтровать, что сохранять».Но если бы я обернул must_not в constant_score или filter-bool, будет ли запрос более производительным?Или ES автоматически позаботится о такой оптимизации?Я просто не понимаю, почему must_not находится в запросе, а не фильтрует контекст в первую очередь.Может ли что-то только частично не соответствовать и, таким образом, уменьшить балл только на градус?

1 Ответ

0 голосов
/ 07 февраля 2019

Относительно 1:

Перемещение соответствия genre в контекст фильтра может немного ускорить его (даже если это зависит от многих других факторов), но вы потеряете рейтинг, чтоможет или не может быть важным для вас.В конце, используйте must, когда ранжирование важно, или filter, если это не так, и ваша единственная цель состоит в том, чтобы соответствовать документу или не соответствовать некоторым критериям.

Более того, использование ключевого слова type даст вам только семантику "точного соответствия", это может быть тем, что вы хотите ... или нет, в зависимости от того, как вы создаете запросы (пользовательский ввод или список контролируемых выборок)...

Относительно 2:

must_not уже уже в контексте фильтра , так что это не становится проще, чем то, что вы уже видите.Контекст фильтра состоит из filter + must_not.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...