Создание настраиваемого полнотекстового поиска в MySQL (создание файла индекса) - PullRequest
1 голос
/ 19 апреля 2011

Я хотел бы сделать свой собственный полнотекстовый поиск, и я не уверен, каков наилучший способ создания индексной таблицы.

Хорошо, я беру текстовое поле и извлекаю все слова, которые длиннеечем 3 к таблице индекса.Но что я должен хранить о них?слово, идентификатор таблицы, где я ищу?Что-нибудь еще?Частота слова?

И вопрос поддержки: Как разделить текстовое поле на слова, есть ли какая-либо функция mysql или я должен сделать это, используя язык на стороне сервера?

ОБНОВЛЕНИЕ: Чтобы сделатьвсе ясно: мне не нужен полнотекстовый поиск, просто список слов из слов, которые есть во всех записях моего текстового поля, поэтому я могу искать окончания как LIKE 'word%'

Ответы [ 3 ]

4 голосов
/ 19 апреля 2011

Если вы собираетесь реализовать только то, что MySQL вызывает boolean mode (без учета релевантности), вам следует реализовать следующие основные функции:

  1. A wordbreaker,алгоритм, который разбивает строки на слова.Это тривиально в английском, но может быть проблемой для некоторых азиатских языков, которые не используют пробелы между словами.

  2. Опционально, stemmer, алгоритм, который сводит слова к их основным формам, так что went и gone оба становятся go.

  3. Опционально, spellchecker, алгоритм, который исправляет распространенные орфографические ошибки.

  4. Опционально, thesaurus, который сводит синонимы к их общей форме.

В результате всего этого у вас есть такая строка:

a fast oburn vixen jmups over an indolent canine

, разделенных на основные формы слов с замененными синонимами и исправленными ошибками:

quick
brown
fox
jump
over
lazy
dog

Затем вы просто создаете составной индекс для (word, rowid), где word - этобазовая форма, а rowid - это PRIMARY KEY индексированной записи.

Чтобы запросить, скажем, '+quick +fox', вы должны найти в вашем индексе эти слова и найти пересечение в rowid.Пересекающийся rowid будет содержать оба слова.

Если вы собираетесь принимать во внимание релевантность, вы должны дополнительно вести статистику по словам в отдельном индексе по всему корпусу.

Я должен предупредить вас, что это не простая задача.Просто взгляните на Sphinx исходный код.

2 голосов
/ 19 апреля 2011

Не делайте этого
Если вы не знаете, что делаете, забудьте о собственном полнотекстовом поиске.
Пусть MySQL сделает тяжелую работу.

  1. Используйте MyISAM для таблицы, по которой вы хотите искать
  2. Поместите индекс FULLTEXT в текстовые поля, которые вы хотите проиндексировать.

Затем выполните

SELECT *, MATCH(field1, field2) AGAINST 'text to search' 
  IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION AS relevancy 
FROM table1 
WHERE MATCH(field1, field2) AGAINST 'text to search' 
  IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
ORDER BY relevancy

См .: http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_match

0 голосов
/ 19 апреля 2011

ОП указал, что он хочет искать окончания слова.

Там, где я живу (Голландия), мы делаем стихи в декабре, поэтому я много раз заканчиваю поиск слов, чтобы найти слова, которые лучше.
Вот мой трюк.

Добавить новое поле в таблицу с именем visa_versa: varchar indexed

UPDATE mytable SET mytable.visa_versa = REVERSE(mytable.myword);

Теперь вы можете выполнять индексированный поиск по окончанию слова с помощью

SET @ending = 'end';
SELECT myword FROM mytable where visa_versa LIKE REVERSE(CONCAT('%',@ending)); 
...