MySQL: лучший способ сделать полнотекстовый поиск по ключевым словам? - PullRequest
0 голосов
/ 26 февраля 2012

Я пытаюсь сделать обратный полный тестовый поиск, но понятия не имею, как лучше всего это сделать.

По сути, у меня есть таблица ключевых фраз, выложенная так:
id - фраза
1 - "Привет, мир"
2 - «Прощай, мир»
3 - «Это мой мир»

Затем у меня есть заданная строка, такая как "Welcome to hello world group". Я хочу найти идентификатор всех строк в моей таблице, которые точно соответствуют фразе. Значение «о» не будет соответствовать, потому что слово «к». Также «ello» не подходит, потому что мир «hello».

Используя полнотекстовый поиск, этого легко достичь, выполнив поиск:
ПРОТИВ («Привет, мир» в булевом режиме);

Проблема в том, что я не верю, что могу использовать полнотекстовый поиск, так как полнотекстовый поиск найдет все строки, содержащие одну фразу. Я хочу, чтобы все фразы (из известного набора фраз) соответствовали одному набору.

Я знаю, как это сделать с помощью RegEx, используя следующее, однако это способ замедления. На столе с 400 000 ключевых фраз это заняло более 40 секунд:

ГДЕ "здесь находятся данные, которые я хочу найти" REGEXP CONCAT ('[[: <:]]', <code>phrases, '[[:>:]]')

Мне нужен более оптимизированный способ сделать это. Как бы я мог выполнить это как полнотекстовый поиск, даже если бы мне пришлось временно добавить его в таблицу, не выполняя LOOP, отдельно проверяя каждое ключевое слово.

Я очень ценю отзывы, так как это приводит к задержке при добавлении новых данных на моем сайте.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Если вы хотите рассмотреть решение, которое считывает фразы из базы данных и создает отдельную структуру данных, используемую для оптимизированного обнаружения фраз, есть два основных метода , которые решают проблему. Какой из них лучше для вас, зависит от ряда факторов, в частности:

  1. Как часто обновляется список фраз
  2. Указывает ли и как текстировать текст перед запуском определения фразы
  3. Как долго целевые строки

Вариант 1: хеш-таблица фраз Это означает, что вы просто вставляете каждую из фраз в качестве ключа в хеш-таблицу (иначе говоря, словарь или хеш-карта во многих языках программирования). Фраза id становится значением. Обновления бывают быстрыми и легкими, но обнаружение фраз в заданной строке может быть трудным: во-первых, вам нужно токенизировать строку и быть уверенным, что фразы встречаются только между границами токенов. Во-вторых, вам нужно выполнить поиск в хэше не только для каждого токена, но также для каждой пары, тройки, четверки и т. Д. Последовательных токенов. Это все еще хорошо работает, если целевые строки, как правило, короткие. Вы также можете сохранить копию хеш-таблицы на диске, например, используя Беркли БД. Для этого в стандартной библиотеке большинства языков программирования есть готовые к использованию модули.

Вариант 2: поиск по дереву (или, чуть более продвинутый, минимизированный поиск или конечный автомат ). Это может быть реализовано очень экономичным способом, но обычно оно больше, чем хеш-таблица (хотя 400k записей не будут проблемой вообще). Большим преимуществом при обнаружении фраз является то, что вам не нужно вырезать токены (или подходящие фразы между границами токенов) перед поиском. Вместо этого вы выполняете поиск с наибольшим соответствием в каждой начальной позиции кандидата в тексте. Хранение на диске возможно, хотя в большинстве языков программирования для этого не будет модуля стандартной библиотеки. Обновления довольно просты в trie, но могут стать трудными (и потенциально трудоемкими) в минимизированном tree или FST.

Обе опции позволяют поддерживать структуру данных на диске (или сохранять ее копию на диске, в то время как фактический поиск происходит в памяти). Но вы не получите безопасность транзакций или отказоустойчивость (что, как я понимаю, вы не ищете).

0 голосов
/ 26 февраля 2012

Вы можете использовать поисковую систему. Например солр. Вы можете установить конкретные фильтры поиска по тексту. + поиск только по словам. + Это будет ослепительно быстро.

Или, во-вторых, вы можете создать собственную таблицу, в которой будут храниться все слова и идентификаторы фразы. и искать только в этой таблице слова. Это будет быстрее, потому что вы можете добавить индекс слов лучше, чем фразы в целом.

...