2015-08-26 4 views
1

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

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

Левенштейна функция здесь: http://www.artfulsoftware.com/infotree/qrytip.php?id=552Оптимизация поиска в полнотекстовом/regexp/levenshtein MySQL

Вот запрос:

SELECT `id`, 
     `word`, 
     MATCH (`word`) AGAINST ('+*search*') IN BOOLEAN MODE) AS `match` 
FROM `words` 
WHERE `word` REGEXP '^.*[search].*$' 
    AND levenshtein(`word`, 'search') <= 2 
ORDER BY levenshtein(`word`, 'search'), `match` ASC 
LIMIT 10; 

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

Любая помощь будет оценена по достоинству.

+0

Я использовал http://sphinxsearch.com/ довольно успешно в прошлом (по общему признанию, не для записей 100 м +, но он был достаточно быстрым, чтобы я не думал, что это даст вам проблему). Вы можете настроить взвешивание различных компонентов, чтобы убедиться, что вы получили «правильные» результаты. –

+0

'[поиск]' ищет '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Это ваше намерение? Я думаю, что 'WHERE \' word \ 'like '% search%'' будет достаточно (если вы пытаетесь просто увидеть, присутствует ли '' поиск' в столбце). – chris85

+0

@ chris85 Это было несколько намерение, да. % search% не дал мне результатов, которые были приближением «поиска» (например, «s34rch»), что сделало все упражнение бесполезным, поскольку это было целью иметь функцию levenshtein – egg82

ответ

0

Я закончил с использованием sphinxsearch как @RobGudgeon предложил. Хотя и не MySQL (и другая база данных по отдельности), это на самом деле очень быстро как при обновлении из MySQL, так и при поиске в собственной базе данных. Рекомендуется для полнотекстового поиска в больших базах данных, так как в настоящее время отсутствует поддержка MySQL.

Смежные вопросы