Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›SQL ›Функции и операторы

Операторы LIKE и RLIKE

LIKE и RLIKE операторы обычно используются для фильтрации данных на основе шаблонов строк. Обычно они применяются к полю, стоящему слева от оператора, но также могут применяться к константному (литеральному) выражению. Правая часть оператора представляет собой шаблон. Оба оператора могут использоваться в условии WHERE оператора SELECT, но LIKE могут также использоваться и в других местах, например, при определении шаблона индекса или в различных командах SHOW. В этом разделе рассматривается только использование SELECT ... WHERE ....

Существенное различие между LIKE/RLIKE и предикатами полнотекстового поиска заключается в том, что первые работают с точными полями, а вторые также работают с обработанными полями. Если поле, используемое с LIKE/RLIKE, не имеет точного ненормализованного подполя (типа keyword), Elasticsearch SQL не сможет выполнить запрос. Если поле является точным или имеет точное подполе, оно будет использоваться как есть, или оно будет автоматически использовать точное подполе, даже если оно явно не было указано в операторе.

Оператор LIKE

Синтаксис:

expression        
LIKE constant_exp 

обычно поле или константное выражение

шаблон

Описание: Оператор SQL LIKE используется для сравнения значения с похожими значениями с помощью операторов подстановок. В связке с оператором LIKE используются два символа подстановки:

  • Знак процента (%)
  • Подчеркивание (_)

Знак процента (%) представляет собой ноль, одну или несколько символов. Подчеркивание (_) представляет собой один символ или цифру. Эти символы могут использоваться в сочетании.

Никакие другие символы не имеют специального значения или не действуют как символы подстановки. Символы, часто используемые в качестве символов подстановки в других языках (* или ?), обрабатываются как обычные символы.

SELECT author, name FROM library WHERE name LIKE 'Dune%';

    author     |     name
---------------+---------------
Frank Herbert  |Dune
Frank Herbert  |Dune Messiah

Также есть возможность использования символа экранирования, если необходимо сопоставить сами символы подстановки. Это можно сделать, используя оператор ESCAPE [escape_character] после оператора LIKE ...:

SELECT name, author FROM library WHERE name LIKE 'Dune/%' ESCAPE '/';

В приведенном примере / определен как символ экранирования, который необходимо поместить перед символами % или _, если необходимо сопоставить эти символы в шаблоне. По умолчанию символ экранирования не определен.

Несмотря на то, что LIKE является допустимым вариантом при поиске или фильтрации в Elasticsearch SQL, предикаты полнотекстового поиска MATCH и QUERY быстрее, намного мощнее и являются предпочтительной альтернативой.

Оператор RLIKE

Синтаксис:

expression         
RLIKE constant_exp 

обычно поле или константное выражение

шаблон

Описание: Этот оператор похож на оператор LIKE, но пользователь не ограничен поиском строки по фиксированному шаблону со знаком процента (%) и подчеркиванием (_); в данном случае шаблон представляет собой регулярное выражение, которое позволяет создавать более гибкие шаблоны.

Для поддержки синтаксиса см. синтаксис регулярных выражений.

SELECT author, name FROM library WHERE name RLIKE 'Child.* Dune';

    author     |      name
---------------+----------------
Frank Herbert  |Children of Dune

Несмотря на то, что RLIKE является допустимым вариантом при поиске или фильтрации в Elasticsearch SQL, предикаты полнотекстового поиска MATCH и QUERY быстрее, намного мощнее и являются предпочтительной альтернативой.

Предпочитайте предикаты полнотекстового поиска

При использовании LIKE/RLIKE рекомендуется использовать предикаты полнотекстового поиска, которые быстрее, намного мощнее и позволяют сортировать результаты по релевантности (результаты могут возвращаться в зависимости от того, насколько хорошо они соответствуют запросу).

Например:

LIKE/RLIKE

QUERY/MATCH

foo LIKE 'bar'

MATCH(foo, 'bar')

foo LIKE 'bar' AND tar LIKE 'goo'

MATCH('foo^2, tar^5', 'bar goo', 'operator=and')

foo LIKE 'barr'

QUERY('foo: bar~')

foo LIKE 'bar' AND tar LIKE 'goo'

QUERY('foo: bar AND tar: goo')

foo RLIKE 'ba.*'

MATCH(foo, 'ba', 'fuzziness=AUTO:1,5')

foo RLIKE 'b.{1}r'

MATCH(foo, 'br', 'fuzziness=1')

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/sql-like-rlike-operators.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API