Elasticsearch: Поиск с помощью Query DSL: запросы на уровне терминов

Теперь, когда мы разобрались с полнотекстовыми запросами, давайте рассмотрим запросы на уровне терминов. Как я уже упоминал во введении в поиск в Elasticsearch, запросы на уровне терминов используются для точного сопоставления значений. Это означает, что поисковые запросы не анализируются перед сопоставлением, как в случае с полнотекстовыми запросами.

Elasticsearch

Это также требует осторожности; строковые поля по умолчанию анализируются анализатором, но поисковые запросы типа term query не анализируются. Это вызывает головную боль у некоторых людей, поскольку они не знают об этом. Если вы добавляете документ со значением поля "pasta!", то вы можете подумать, что сможете найти этот документ, выполнив поиск по этому же значению. Однако это не так, потому что значение было проанализировано, восклицательный знак был удален. Поэтому значение документа больше не является точным соответствием поисковому запросу. Обратите внимание, что этот пример верен для анализатора по умолчанию, но может отличаться, если для поля выбран другой анализатор. Это потенциальная проблема для строковых полей, но терминологические запросы не так часто используются для полей такого типа. Чтобы избежать этой проблемы, можно указать Elasticsearch не анализировать значения поля, что означает, что они будут добавлены в индекс как есть. Для этого просто задайте свойству index поля значение not_analyzed.

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

Этот запрос ищет точный термин active для поля status.

Аналогично, запрос terms ищет документы, поля которых соответствуют любому из заданных терминов. Как вы могли заметить, название запроса во множественном числе, что означает, что мы можем искать несколько терминов, передавая их в виде массива для поля.

В этом примере мы искали продукты, которые имеют статус "inactive" или "paused".

Другим термином запроса является запрос диапазона, который ищет значения в определенном диапазоне. Его можно использовать с несколькими типами данных, такими как даты, но я покажу пример, который работает с числами. В частности, я хочу найти продукты с 1-10 экземплярами в инвентаре.

Кроме параметров gte и lte, существуют также параметры lt и gt, которые переводятся как "меньше чем" и "больше чем" соответственно.

Существует ряд запросов, которые используются реже, чем те, которые я вам только что показал, поэтому я просто кратко расскажу о них, не показывая примеров их использования. Если вы хотите увидеть примеры, то обратитесь к документации.

Первым я расскажу о префиксном запросе, который ищет поля, содержащие термины с заданным префиксом. Например, префиксный поиск по полю "имя" найдет документ с названием "макароны".

Еще один запрос на уровне терминов - это запрос с подстановочным знаком, который позволяет использовать подстановочные знаки в поисковых запросах. Звездочка (*) используется для соответствия любой последовательности символов, включая пустую. Вопросительный знак (?) используется для поиска любого отдельного символа. Обратите внимание, что этот запрос может быть довольно медленным, и для предотвращения очень медленных запросов запрещено помещать подстановочные знаки в начало термина.

Аналогично запросу с подстановочными знаками существует запрос regexp, который выполняет поиск на основе регулярных выражений. Это дает большую гибкость при поиске документов, но, опять же, обратите внимание, что следует быть осторожным с точки зрения производительности. Производительность такого запроса сильно зависит от регулярного выражения. Лучше всего использовать как можно более длинный префикс перед регулярным выражением для достижения наилучшей производительности. Опять же, помните, что этот запрос также ищет значения анализируемых полей, которые могут отличаться от значений, добавленных вами в документ.

Осталось два запроса, о которых я хочу кратко упомянуть. Запрос exists ищет документы, в которых данное поле содержит любое ненулевое значение, а запрос missing ищет документы, в которых данное поле либо отсутствует, либо содержит только NULL-значения.

Это были самые важные вещи о запросах на уровне терминов.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий