Есть несколько разных вопросов и концепций, которые нужно распаковать.
Совпадение с термином
A match
запрос выполняет анализ (удаление общих стоп-слов, использование ствола для удаления завершающего "ing", "es"и т. д.) перед указанием значений поиска, прежде чем искать их в индексе.Цель анализа - сделать так, чтобы слова, которые означают примерно одно и то же, совпадали, например, если вы ищете «бананы», но вы проиндексировали «банан», он все равно найдет его.Стоит отметить, что для того, чтобы это работало, анализ также должен выполняться на поле при индексации данных, что и делает поле типа text
в Elasticsearch.
A term
запрос является точнымсовпадать без анализа.Это больше похоже на то, к чему вы привыкли в реляционной базе данных.Они предварительно сформированы для полей keyword
и других полей типа данных (числовые, логические, даты).Если вам нужно сопоставить оба пути, вы можете проиндексировать поле, используя оба типа.
Запрос против фильтра
A query
вasticsearch - это серия условий поискаэто будет оцениваться и ранжироваться друг против друга на основе их актуальности.Другими словами, основываясь на словах, которые вы просили меня найти, какие документы кажутся наиболее релевантными.
A filter
вasticsearch ограничивает набор записей, для которых выполняется запрос, и не оценивает преформу.Вы можете думать об этом как о первом проходе, который определяет, какие записи следует проверять перед выполнением более дорогих вычислений, чтобы определить, насколько релевантны ваши условия поиска для каждого документа.
Другое важное различие, которое вы упомянули, - filters
кэшируются, но queries
нет.Обычно, если у вас есть широкие условия, которые вы хотите применить, вы можете сделать эти фильтры и сделать часть поиска "человеческим текстом" запросом.Вообще говоря, если у вас есть широкие ограничения, вы можете сделать это, чтобы ограничить доступный для поиска набор документов, вы можете поместить его в фильтр, чтобы воспользоваться преимуществами кэширования и экономии времени, избегая скоринга.Например, что-то вроде: отфильтруйте только продукты в кулинарных книгах, затем запросите заголовки со словом «бананы».
Измерения производительности
Измерение производительности запроса может быть затруднено, посколькув миксе много движущихся частей.Наилучший подход, если у вас есть время, - это индексировать репрезентативный (и несколько большой) объем данных на одном узле, а затем выполнить первоначальное тестирование с этим до масштабирования.Возможно, вы захотите взглянуть на инструмент Elasticsearch для тестирования производительности, который называется Rally.
https://github.com/elastic/rally
Собираем все вместе
Для вашего примеравыше, так как поле, которое вы ищете, является логическим, вам нужно выполнить запрос term
, а не match
.Кроме того, вы можете сделать это в предложении filter
, потому что нет никакой оценки релевантности для единственного логического значения.Если вы хотите объединить его с другим текстовым поиском, вы можете добавить предложение соответствия в контексте query
к своему телу json.