Технологии текстового поиска по данным mysql

задача реализовать текстовый поиск в MySQL в моем проекте (PHP/Zend Framework 2 + MySQL). Проблема в том, что текстовые поля совсем не большие, это в основном поля VARCHAR или объединенные поля, такие как названия городов, названия компаний и т. Д., Около 5-10 полей для каждой сущности. Итак, в настоящее время я решил выбрать Lucene (модуль Zend Framework 2 - Zend Search), но будет ли эффективно использовать такие технологии, как Lucene или Sphinx, для небольших полей varchar?

Спасибо.


person Cassius    schedule 19.07.2013    source источник
comment
О каком количестве данных вы говорите? Это масштабные инструменты.   -  person Smandoli    schedule 20.07.2013
comment
модули/таблицы: они разные, от 5к до 300к записей, а таблица истории оценивается в несколько миллионов записей   -  person Cassius    schedule 20.07.2013


Ответы (1)


Конечно, Lucene или Sphinx могут работать с любыми столбцами varchar, содержащими текст*. Они не должны быть огромными.

Любое решение для полнотекстового индексирования в сотни или тысячи раз лучше, чем использование LIKE '%word%'!

Вас может заинтересовать моя презентация, Fulltext Search Throwdown.

Вы также можете посмотреть запись моей презентации в виде вебинара: http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown (это бесплатно, но требует регистрации).

* Lucene и Sphinx также могут кое-что делать с числовыми столбцами.

PS: Я руководил проектом Zend Framework 1.0. Zend_Search_Lucene был интересным экспериментом примерно в 2007 году, но он сильно устарел по сравнению с Apache Lucene/Solr, а Zend_Search_Lucene на несколько порядков медленнее, чем реализация Java. Я бы не стал с этим заморачиваться.

person Bill Karwin    schedule 19.07.2013
comment
Привет, Билл. Спасибо за комментарий и ценную презентацию. Я также с нетерпением жду возможности использовать/переключиться на сервер percona. - person Cassius; 20.07.2013
comment
У @Bill Karwin есть хорошее предложение. Я разработал поисковую систему, которая была у PRWeb, и мы имели дело всего с 50 миллионами документов, но это было значительно лучше, чем использовать для поиска СУБД. Необходимое отличие: потоки поиска по-прежнему подлежат блокировке строк, страниц и таблиц. Таким образом, все поиски могут (в лучшем случае) икать, когда вы добавляете/обновляете/индексируете серию строк. Этот вид соперничества не является необходимым для вашей базы данных, но вызывает много состязаний читателей в ваших искомых таблицах. - person memnoch_proxy; 20.07.2013
comment
Percona — хороший выбор, но я подозреваю, что их консультанты порекомендуют вам не сочетать RDBM с полнотекстовым поиском, если только у вас не очень маленькая пользовательская база. - person memnoch_proxy; 20.07.2013
comment
@memnoch_proxy, я работаю в Percona консультантом и тренером. Мы рекомендуем полнотекстовый поиск, если в качестве альтернативы используется LIKE с подстановочными знаками. - person Bill Karwin; 20.07.2013
comment
Да, реализация Java быстрее, чем Zend_Search_Lucene, вопрос в том, пытаемся ли мы убить бабочку из пушки, относительно масштаба приложения и нескольких слов, содержащих поля. - person Cassius; 21.07.2013
comment
После того, как ваша таблица вырастет до нескольких десятков тысяч строк, вас не устроит ничего, кроме решения для полнотекстового поиска. Просто это будет слишком медленно. Но вы также можете использовать таблицы MyISAM для текста с возможностью поиска, это будет намного проще, чем изучение другого инструмента, такого как Solr или Sphinx. Я бы сохранил реальные данные в таблицах InnoDB и просто скопировал доступный для поиска текст в таблицу MyISAM. Я не верю, что MyISAM не испортит мои данные. - person Bill Karwin; 21.07.2013