В этой статье мы поговорим о регулярных выражениях и о том, как их можно использовать в Manticore Search
Если говорить о текстовом поиске, простейший способ - это простое сравнение строк. И строка поиска, и документ или поле должны быть абсолютно одинаковыми. Следующий метод текстового поиска - выполнение простого сопоставления шаблона, который может позволить сопоставить строку поиска как подчасть поля. Это простое сопоставление шаблона может использовать базовые операторы, такие как подстановочные знаки, где метасимвол вроде *
или %
означает “совпадение с любыми символами”. В базах данных это обычно выполняется с помощью оператора LIKE, например:
SELECT * FROM mytable WHERE title LIKE '%and%'
будет находить строки с заголовками, содержащими подстроку ‘and’.
Регулярные выражения работают с обычными текстами, как и LIKE, но они обладают мощным набором метасимволов-операторов, позволяющих создавать сложные шаблоны поиска. Шаблон регулярного выражения работает на уровне символов и может сопоставлять буквы, цифры и другие символы, либо по буквальному значению (например, /abc/
будет сопоставляться с abc
), либо по типу класса, например, \w
будет сопоставляться с [A-Aa-z0-9_]
. Шаблон также может включать булев оператор или
, например, abc|xyz
, квантификации - ?
отмечает ноль или одно вхождение предшествующих символов или подстановочный знак (метасимвол .
).
В отличие от регулярных выражений, полнотекстовый поиск работает не с обычными текстами, а анализирует тексты и сегментирует их на слова. Полнотекстовый поиск пытается найти не шаблон в строке, а ищет в коллекции слов. Хотя регулярные выражения могут находить и изолировать слова, у них есть естественные ограничения - они не могут выполнять простые бинарные поиски вроде abc -xyz
или работать с морфологической функциональностью. Некоторые функции, встречающиеся в регулярных выражениях, можно также найти в полнотекстовом поиске, например, операторы начало/конец. Некоторые работают по-другому. Например, подстановочные знаки в регулярных выражениях могут замещать любое количество символов, но в случае полнотекстового поиска подстановочные знаки могут расширяться только в пределах слова или быть полными заменителями слова.
Как регулярные выражения используются в Manticore Search?
До сих пор регулярные выражения были доступны как дополнительная функция во время индексации с помощью
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() может быть незаменимым. Дайте нам знать, если вы найдете его полезным!