80
Индексный поиск по регулярным выражениям Александр Коротков Интаро Софт

PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Embed Size (px)

DESCRIPTION

Доклад был представлен на официальной российской конференции PG Day'14 Russia, посвященной вопросам разработки и эксплуатации PostgreSQL. Регулярные выражения — мощный и широко применяемый инструмент для обработки текстовых данных. При поиске по регулярному выражению в большом наборе строк, становится актуальным вопрос о применении индекса. В то же время, использование индексов для поиска по регулярному выражению — нетривиальная задача. Существует два основных подхода к выполнению поиска по регулярным выражениям с помощью индекса: "FREE indexing engine" [1], основанный на выделении из регулярного выражения непрерывных фрагментов текста, а также метод, разработанный для Google Code Search [2], осуществляющий рекурсивный анализ составных частей регулярного выражения, с целью выявления его атрибутов. В целом же, оба этих подхода используют обратные индексы на основе k-грам (подстрок исходной строки длины k) и различаются методом извлечения k-грам из регулярного выражения для последующего поиска по индексу. Данный доклад представляет новый метод извлечений k-грам из регулярного выражения, основанный не на анализе исходного регулярного выражения, а на преобразовании соответствующего конечного автомата. Предлагаемый подход позволяет осуществить более полное извлечение k-грам из регулярного выражения, что подтверждается примерами. Данный подход был реализован в модуле pg_trgm СУБД PostgreSQL 9.3 [3].

Citation preview

Page 1: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Индексный  поиск  по  регулярным  выражениям

Александр  Коротков Интаро Софт

Page 2: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Введение

Page 3: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

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

• Мощный  инструмент  обработки  текстовой  информации

• Основаны  на  математической  лингвистике

• Выражают  тот  же  класс  языков,  что  и  лингвистические  автоматы

Page 4: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Автоматы…  нет,  не  слышал

Page 5: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Итак…  автоматы

• Регулярное  выражение  может  быть  преобразовано  в  лингвистический  автомат

• Такое  преобразование  используется  в  «движках»  регулярных  выражений

Page 6: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Итак...  автоматы • Автомат  – это  ориентированный  граф,  вершины  которого  – «состояния»,  а  дуги  – «переходы»,  помеченные  символами.

• Выделяются  начальное  состояние  и  конечное  состояние

• Автомат  «читает»  строку.

Page 7: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

/a(bc)*d/

становится

Page 8: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 9: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 10: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 11: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 12: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 13: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 14: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 15: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 16: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 17: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 18: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 19: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Page 20: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример

xyzabcbcdxyz

Ура!  Подходит!

Page 21: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Ну  теперь  все  мы  знаем…

Page 22: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Поиск  по  регекспам в  PostgreSQL

• PostgreSQL поддерживает  поиск  по  регулярным  выражениям

• До  версии  9.3  это  был  только  последовательный  поиск

Page 23: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Обратные  индексы на  n-грамах

Page 24: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

N-грамы?

Page 25: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

N-грамы

• N-грамы – это  подстрока  длины  n • Широко  используются в  различных  нетривиальных  задачах  поиска  по  строкам

Page 26: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Обратные  индексы  на  n-грамах

• Обратный  индекс  на  n-граммах  содержит  соответствие  между  n-граммой и  всеми  строками,  где  она  встречается.

• Модуль  PostgreSQL pg_trgm содержит  реализацию  такого  индекса  для  n = 3.

Page 27: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

pg_trgm

' e': {1,2} 'egu': {1,3} 'pre': {1,2}

' r': {1,3} 'er ': {3} 'reg': {1,3}

' s': {2,3} 'ess': {1,2} 'res': {1,2}

' ex': {1,2} 'exp': {1,2} 'sio': {1}

' re': {1,3} 'gul': {1,3} 'siv': {2}

' sp': {2,3} 'ion': {1} 'spe': {2,3}

'ach': {2} 'ive': {2} 'ssi': {1,2}

'ake': {3} 'ker': {3} 'ula': {1,3}

'ar ': {1,3} 'lar': {1,3} 've ': {2}

'ch ': {2} 'ns ': {1} 'xpr': {1,2}

'eac': {2} 'ons': {1}

'eak': {3} 'pea': {2,3}

1. "regular expressions", 2. "expressive speach", 3. "regular speaker"

=>

Page 28: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Частоты  N-грам

DBLP: 2.5M заголовков  статей • “the”  - 360K • “zzz”  – 1 глава  "Zzzzzzzzzzzzzzzzzzzzzzzzzz" книги  "Formal

Specification and Development in Z and B" от David Everett

Page 29: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Не  все  N-грамы одинаково  полезны

Page 30: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

V-грамы и  мультиграмы

• У каждой  n-грамы – своё  индивидуальное  n

• Выше  эффективность!

Page 31: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

V-грамы и  мультиграмы

Проблемы: • Трудно  поддерживать  актуальность

• …

Page 32: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Патентные  тролли!

Page 33: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Как  использовать  индекс для  поиска  по  регэкспам?

Page 34: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Общая  идея

/[ab]cde/ => (acd OR bcd) AND cde

Page 35: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

/[ab]cde/ => (acd OR bcd) AND cde

Как  это  сделать  в  общем  случае?

Page 36: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Существующие  подходы  к  извлечению n-грам

из  регулярных  выражений

Page 37: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Научная  работа

Junghoo Ch and Sridhar Rajagopalan, A fast regular expression indexing engine, Proceedings 18th International Conference on Data Engineering, 2002 Всё  ещё  широко  цитируется,  как  актуальное  решение  в  данной  области.

Page 38: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод  FREE

• Извлечь  дерево  непрерывных  участков  строки  из  регэкспа.

• Преобразование  этих  непрерывных  кусков  в  мультиграмы (n-грамы с  изменяемым  n)

• Использовать  инвертированный  индекс  на  мультиграмах для  выполнения  запроса

Page 39: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод  FREE: пример

Дерево  для /(abcd|efgh)(ijklm|x*)/

Page 40: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод FREE: пример

Заменить  узлы  “*”  на NULL

Page 41: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод FREE: пример

NULL  “съедает”  родительский узел  OR

Page 42: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод FREE: пример

Узел  AND  “съедает”  дочерний NULL

Page 43: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод FREE: пример

Уберём  вырожденный  AND

Page 44: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод FREE: пример

Разобьем  непрерывные  куски  строк  на  n-грамы

Page 45: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Google code search

Page 46: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Google code search

• Запустился  в 2006.

• Скорее  всего  использовал  что-то  получше,  чем  предыдущий  метод.

• Но  мы  не  знаем  что... :(

Page 47: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Мы  не  знали  что,  пока..

• Google code search закрылся  в 2011 :(

• http://swtch.com/~rsc/regexp/regexp4.html

• Более  5 лет  интриги!

Page 48: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод  google code search

• 5 характеристик: emptyable, exact, prefix, suffix, match.

• Характеристики  рекурсивно  объединяются

• Инвертированный  индекс  на  триграммах

Page 49: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод  google code search

Исходное  выражение: /a(bc)+d/

a: {exact: a}

bc: {exact: bc}

d: {exact: d}

(bc)+: {prefix:bc, suffix: bc}

a(bc)+: {prefix:abc, suffix:bc}

a(bc)+d: {prefix:abc, suffix:bcd}

Page 50: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Метод  google code search

/a(bc)+d/

{prefix:abc, suffix:bcd}

abc AND bcd

Page 51: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Предлагаемый  метод

Page 52: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Предлагаемый  метод

• Анализировать  не  само  регулярное  выражение,  а  соответствующий  ему  лингвистический  автомат.

• Преобразовывать  лингвистический  автомат  в  контактную  схему  на  триграммах.

• Использовать  обратный  индекс  модуля  pg_trgm вместе  с  полученной  контактной  схемой.

Page 53: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

/a(b+|c+)d/

Page 54: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 55: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 56: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 57: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 58: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 59: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 60: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 61: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 62: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 63: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 64: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 65: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 66: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 67: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 68: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 69: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 70: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Page 71: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Пример  преобразования

Результат  можно  упростить

Page 72: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Сравнение  на  примерах

Regex: /(abc|cba)def/

FREE: (abc OR cba) AND def

GSC:

def AND ((abc AND bcd AND cde) OR (ade AND bad AND cba))

Предложенный  метод:

(abc AND bcd AND cde AND def) OR (ade AND bad AND cba AND def)

Page 73: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Сравнение  на  примерах

Regex: /abc+de/

FREE: nothing

GSC: abc AND cde

Предложенный  метод  :

(abc AND cde AND bcd) OR

(abc AND cde AND bcc AND ccd)

Page 74: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Сравнение  на  примерах

Regex: /(abc*)+de/

FREE: nothing

GSC: nothing

Предложенный  метод  :

(abd AND bde) OR

(abc AND bcd AND cde) OR

(abc AND bcc AND ccd AND cde)

Page 75: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Сравнение  на  примерах

Regex: /ab(cd)*ef/

FREE: nothing

GSC: nothing

Предложенный  метод  :

(abe AND bef) OR

(abc AND bde AND cde AND def)

Page 76: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Проблемы

• Может  получиться  большой  граф

- Есть  graceful degradation.

• Использование  триграм вместо  v-грам (мультиграм)

- Смягчается  с  помощью  GIN fast scan в  PostgreSQL 9.4

Page 77: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Тесты  производительности

GIN fast scan рулит!

Regex Seq scan,  мс 9.3,  мс 9.4, мс

/database.*(sql|query)/ 5045 187 67

/postgres(ql)?/ 4573 75 4,3

/plan+er/ 3810 655 37

/(nucl|anino).*acid/ 4327 560 16

/[aei](bc)+a/ 2195 639 1,3

2.5 M заголовков  статей  DBLP средней  длины 47

Page 78: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Текущее  состояние

Нужно:

• PostgreSQL 9.3+

• pg_trgm contrib

Page 79: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Было  опущено

• Детерминированные  vs недетерминированные  автоматы

• Группировка  символов  в  цвета

• Начало  и  конец  строки

Page 80: PG Day'14 Russia, Индексный поиск по регулярным выражениям, Александр Коротков

Спасибо  за  внимание!