Регулярные выражения в Manticore Search

В этой статье мы поговорим о регулярных выражениях и о том, как вы можете использовать их в Manticore Search
Если говорить о сопоставлении текста, самым простым является просто сравнение строк. И строка поиска, и документ или поле должны быть точно одинаковыми. Следующий метод текстового поиска - это выполнение простого сопоставления шаблона, которое позволяет сопоставить строку поиска как подчасть поля. Это простое сопоставление шаблона может использовать базовые операторы, такие как подстановочные знаки, где мета-символ, такой как * или %, означает 'сопоставить любые символы'. В базах данных это обычно достигается с помощью оператора LIKE, например:

SELECT * FROM mytable WHERE title LIKE '%and%'

будет сопоставлять строки с заголовками, содержащими буквальную подстроку 'and'.

Регулярные выражения работают с обычными текстами, так же как и LIKE, но они имеют мощный набор мета-символов-операторов, которые позволяют строить сложные шаблоны сопоставления. Шаблон regex работает на уровне символов и может сопоставлять буквы, числовые цифры и другие символы, либо по буквальному значению (например, /abc/ будет сопоставлять abc), либо по классу типа, например, \w будет сопоставлять [A-Aa-z0-9_]. Шаблон также может включать логическое или, например, abc|xyz, квантификаторы - ? обозначает ноль или одно вхождение предшествующих символов или подстановочные знаки (мета-символ .).

В отличие от regex, полнотекстовые поиски не работают с обычными текстами, а разбирают тексты и сегментируют их на слова. Полнотекстовый поиск не пытается найти шаблон в строке, а ищет в коллекции слов. В то время как регулярные выражения могут находить и изолировать слова, у них есть естественные ограничения, так как они не могут выполнять простые бинарные поиски, такие как abc -xyz, или работать с морфологической функциональностью. Некоторые функции, найденные в регулярных выражениях, также могут быть найдены в полнотекстовых поисках, такие как операторы start/end. Некоторые работают по-другому. Например, подстановочные знаки в регулярных выражениях могут занимать место для любого количества символов, но в случае полнотекстовых поисков подстановочные знаки могут расширяться только в пределах слова или могут быть полными заменами слова.

Регулярные выражения были доступны до сих пор как опциональная функция во время индексации с помощью regexp_filter . Регулярные выражения могут использоваться для выполнения преобразований строк, которые в противном случае сложнее реализовать с помощью обычных опций токенизации. Например, лигатура 'ae' может быть заменена на 'a', или вы можете заменить шаблон, такой как XX", на XX дюйм.

С тех пор как 2.7.5 регулярные выражения могут использоваться в запросах SELECT с помощью функции REGEX() . REGEX() принимает строку на входе, которая может поступать из строкового атрибута или свойства JSON-строки, и регулярное выражение, которое будет проверяться на входе. REGEX работает только с значениями атрибутов, его нельзя использовать для полнотекстовых полей.

Зачем нужна функция REGEX, если мы уже можем индексировать тексты в полнотекстовых полях?
Во-первых, у нас могут быть строки (либо как атрибуты, либо в данных JSON), на которых нам нужно применить шаблон поиска, который не обязательно связан с полнотекстовым сопоставлением. Например, метаданные могут содержать некоторые коды, и мы хотим сузить поиск, чтобы предоставить только записи, когда эти коды начинаются с цифры, например

SELECT * FROM myindex WHERE MATCH('something') AND REGEX(json_attr.code, "^\d\w+")

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

Например, метаданные продукта, заключенные в объект JSON, могут содержать свойство со списком совместимых устройств этого продукта. С помощью REGEX мы можем создать шаблон, который может сопоставить продукт, который мы хотим, или даже серию этого продукта:

SELECT * FROM myindex WHERE MATCH('red case') AND REGEX(json_attr.compatible_devices, "Galaxy S[7|8|9]")

В некоторых случаях REGEX() может быть незаменим. Дайте нам знать, если вы найдете это полезным!

Установить Manticore Search

Установить Manticore Search