pg day'14 russia, Индексный поиск по регулярным выражениям,...

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

Upload: pgdayrussia

Post on 16-Jun-2015

170 views

Category:

Software


5 download

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].

TRANSCRIPT

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, Индексный поиск по регулярным выражениям, Александр Коротков

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