2010-05-05 3 views
5

Я изучаю полнотекстовые поисковые системы для django. Должна быть проста в установке, быстрая индексация, быстрое обновление индекса, а не блокирование при индексировании, быстрый поиск.Полнотекстовый поиск django: Mysql не так уж плохо? (vs sphinx, xapian)

После прочтения многих веб-страниц, я положил в коротком списке: Mysql MYISAM полнотекстового, djapian/питон-Xapian и Джанго-сфинкс я не выбирал Lucene, потому что кажется сложным, ни сен, как это имеет меньше возможностей, чем djapian/django-spĥinx (например, взвешивание полей).

Затем я сделал несколько тестов, чтобы сделать это, я собрал много бесплатных книг в сети, чтобы создать таблицу базы данных с 1 485 000 записей (id, title, body), каждая запись составляет около 600 байтов. Из базы данных я также создал список из 100 000 существующих слов и перетасовал их для создания списка поиска. Для тестов я сделал 2 прогона на моем ноутбуке (4Go RAM, Dual core 2.0Ghz): первый, сразу после перезагрузки сервера, чтобы очистить все кеши, второй выполняется juste после этого, чтобы проверить, насколько хороши результаты кэширования , Вот «дома из» Результаты тестов:

1485000 records with Title (150 bytes) and body (450 bytes) 

Mysql 5.0.75/Ubuntu 9.04 Fulltext : 
========================================================================== 

Full indexing : 7m14.146s 

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:11.553524 
next run : 0:00:00.168508 

Mysql 5.5.4 m3/Ubuntu 9.04 Fulltext : 
========================================================================== 

Full indexing : 6m08.154s 

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:09.553524 
next run : 0:00:20.316903 

1 thread, 100000 searchs with single word randomly taken from database : 
First run : 9m09s 
next run : 5m38s 

1 thread, 10000 random strings (random strings should not be found in database) : 
just after the 100000 search test : 0:00:15.007353 

1 thread, boolean search : 1000 x (+word1 +word2) 
First run : 0:00:21.205404 
next run : 0:00:00.145098 

Djapian Fulltext : 
========================================================================== 

Full indexing : 84m7.601s 

1 thread, 1000 searchs with single word randomly taken from database with prefetch : 
First run : 0:02:28.085680 
next run : 0:00:14.300236 

python-xapian Fulltext : 
========================================================================== 

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:26.402084 
next run : 0:00:00.695092 

django-sphinx Fulltext : 
========================================================================== 

Full indexing : 1m25.957s 

1 thread, 1000 searchs with single word randomly taken from database : 
First run : 0:01:30.073001 
next run : 0:00:05.203294 

1 thread, 100000 searchs with single word randomly taken from database : 
First run : 12m48s 
next run : 9m45s 

1 thread, 10000 random strings (random strings should not be found in database) : 
just after the 100000 search test : 0:00:23.535319 

1 thread, boolean search : 1000 x (word1 word2) 
First run : 0:00:20.856486 
next run : 0:00:03.005416 

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

Mysql мне кажется хорошим выбором, так как нет ничего, что можно было бы установить (мне нужно просто написать небольшой скрипт для синхронизации таблицы производства Innodb с таблицей поиска MyISAM), и поскольку мне действительно не нужна расширенная функция поиска, например, и т. д. ...

Возникло вопрос: Что вы думаете о Mysql полнотекстовой поисковой системе против sphinx и xapian?

ответ

4

Я не проверял Xapian, но я сделал презентацию в прошлом году по сравнению полнотекстового решения: http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

Sphinx является самым быстрым в поиске. Но сложно индексировать данные, которые поступают постепенно, потому что добавление данных в индекс примерно так же дорого, как создание всего индекса с нуля.

Таким образом, некоторые люди поддерживают два индекса Sphinx: один большой индекс с заархивированными данными и один небольшой индекс с последними данными. Периодически (например, еженедельно) они объединяют недавний индекс в архивированный индекс (слияние двух индексов менее дорого) и обрезают небольшой индекс для подготовки к новой неделе. Это отлично работает для чего-то вроде форума, но не так хорошо для вики.

Вы также можете ознакомиться с Apache Solr. Это оболочка для Lucene, и это делает использование Lucene намного проще и еще более функциональным. Я не знал о Сольре, когда я разработал эту презентацию.

The Washington Times является примером проекта, который использует Solr вместе с Django:

2

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

Недостатком является довольно рудиментарное соответствие слов.Очевидно, что никаких выводов, но также нет специальной обработки дефиса/апострофа, а длина минимального слова по умолчанию и stop list является чрезмерно чрезмерной. (Когда программное обеспечение считает, что «howbeit» является типично типизированным словом, волнуйтесь!)

Хуже: конечно, это эксклюзивно для неприятного старого MyISAM, поэтому он не будет сидеть красиво в ваших таблицах InnoDB. (Вы являются с помощью InnoDB, верно?)

1

Вы могли бы также рассмотреть SphinxQL какой вид сочетает в себе простоту использования полнотекстовых возможностей MySQL с силой и гибкостью Сфинкса.

Инструкция по монтажу here