SQL с регулярными выражениями против индексов с функциями логического слияния - PullRequest
1 голос
/ 15 мая 2010

Я пытаюсь разработать сложную текстовую поисковую систему. У меня есть тысячи текстовых страниц из многих книг. Мне нужно искать страницы, которые содержат указанные сложные логические критерии. Эти критерии могут содержать практически любую комбинацию из следующих:

A: Полные слова.

B: Корни слов (полулезные по отношению к основам; то есть все слова с определенными ключевыми буквами).

C: Словарные шаблоны (в некоторых языках корни заполняются в определенных шаблонах, образуя различные части речи, такие как прилагательные, глаголы прошлого / настоящего ...).

D: Логические связки: AND / OR / XOR / NOT / IF / IFF и скобки для указания приоритетов.

Теперь, будет ли быстрее иметь полный текст страниц в базе данных (не проиндексированный) и выполнять поиск по всем из них с помощью SQL и регулярных выражений?

Или лучше построить индексы кортежей word / root / template-page-location. Следовательно, мы можем ускорить поиск отдельных слов / корней / шаблонов. Однако, это становится сложным, когда мы вводим логические связки в наши запросы. В таких случаях я думал о следующих шагах:

1: поиск по каждому отдельному слову / корню / шаблону в указанном запросе.

2: На основе приоритетов мы объединяем два списка результатов (начиная с шага 1), одновременно углубляясь в логическое связующее

Например, если мы ищем «он И (ИЛИ был)»:

1: Мы будем искать слова «он», «есть» и «был» отдельно и получать списки результатов для каждого слова.

2: объединить списки результатов "is" и "was" с помощью функции объединения OR-MERGE.

3: объединить объединенный список результатов из функции OR-MERGE с "он", используя функцию объединения AND-MERGE.

Результат шага 3 затем возвращается как результат указанного запроса.

Как вы думаете, гуру? Что быстрее? Есть идеи получше?

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

1 Ответ

1 голос
/ 15 мая 2010

Существует множество готовых решений для такого рода проблем. Я настоятельно рекомендую вам использовать один из них вместо разработки собственного.

Вы не говорите, какое решение для базы данных вы используете. Если это Microsoft SQL Server, вы можете использовать его Полнотекстовый поиск . Если это MySQL, взгляните на его Функции полнотекстового поиска . Я уверен, что Oracle, DB2 и любые другие крупные СУБД будут иметь аналогичную функциональность.

Кроме того, взгляните на Apache Lucene для Java или Lucene для .NET . Это позволит вам индексировать документы без использования СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...