Если вы собираетесь реализовать только то, что MySQL
вызывает boolean mode
(без учета релевантности), вам следует реализовать следующие основные функции:
A wordbreaker
,алгоритм, который разбивает строки на слова.Это тривиально в английском, но может быть проблемой для некоторых азиатских языков, которые не используют пробелы между словами.
Опционально, stemmer
, алгоритм, который сводит слова к их основным формам, так что went
и gone
оба становятся go
.
Опционально, spellchecker
, алгоритм, который исправляет распространенные орфографические ошибки.
Опционально, 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
исходный код.