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

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

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

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

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

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

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

Начиная с 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