Сравнение полнотекстовой поисковой системы-Lucene, Sphinx, Postgresql, MySQL?

Я строю сайт Django, и я ищу поисковую систему.

несколько кандидатов:

  • Lucene / Lucene с компасом / Solr

  • Сфинкс

  • Postgresql встроенный полнотекстовый поиск

  • MySQl встроенный полнотекстовый поиск

критерии отбора:

  • релевантность и ранжирование
  • поиск и индексирование скорость
  • простота использования и простота интеграции с Django
  • требования к ресурсам-сайт будет размещен на VPS, так что в идеале поисковая система не потребует много ОЗУ и процессора
  • масштабируемость
  • дополнительные функции, такие как "вы имели в виду?", похожие запросы, и т. д.

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

EDIT: что касается индексации, поскольку пользователи продолжают вводить данные на сайт, эти данные должны быть проиндексированы непрерывно. Это не должно быть в реальном времени, но в идеале новые данные будут отображаться в индексе с задержкой не более 15 - 30 минут

8 ответов


приятно видеть, что кто-то вмешался в Лудене - потому что я понятия не имею об этом.

  • рейтинг релевантности результатов по умолчанию. Вы можете настроить свою собственную сортировку, если хотите, и дать определенным полям более высокие веса.
  • скорость индексирования супер-быстрая, потому что она разговаривает непосредственно с базой данных. Любая медлительность будет исходить из сложных SQL-запросов и неиндексированные внешние ключи и другие подобные проблемы. Я тоже никогда не замечал медлительности в поисках.
  • Я парень Rails, поэтому я понятия не имею, насколько легко реализовать с Django. Существует API Python, который поставляется с источником Sphinx.
  • демон службы поиска (searchd) довольно низок по использованию памяти - и вы можете установить ограничения на сколько процесс индексатора также использует.
  • масштабируемость-это то, где мои знания более отрывочны - но достаточно легко скопировать индексные файлы на несколько машин и запустить несколько демонов searchd. Общее впечатление, которое я получаю от других, заключается в том, что он чертовски хорош при высокой нагрузке, поэтому масштабирование его на нескольких машинах-это не то, с чем нужно иметь дело.
  • нет поддержки для "Вы-имеете в виду" и т. д., Хотя это можно сделать с помощью других инструментов достаточно легко. Сфинкс делает stem-слова, используя словари, поэтому "вождение" и "диск" (например) будут то же самое рассматривалось и при обысках.
  • Sphinx не разрешает частичные обновления индекса для полевых данных. Общий подход к этому-поддерживать Дельта-индекс со всеми последними изменениями и повторно индексировать его после каждого изменения (и эти новые результаты появляются в течение секунды или двух). Из-за небольшого объема данных это может занять несколько секунд. Вам все равно нужно будет регулярно переиндексировать основной набор данных (хотя насколько регулярно зависит от волатильности ваших данных - каждый день? каждый час?). На скорость индексации, но это все довольно безболезненно.

Я понятия не имею, насколько это применимо к вашей ситуации, но Эван Уивер сравнил несколько вариантов поиска общих рельсов (Сфинкс, хорек (порт Люсена для Рубина) и Solr), запуск некоторых тестов. Думаю, это может быть полезно.

Я не проник в глубины полнотекстового поиска MySQL, но я знаю, что он не конкурирует со скоростью и функциональностью Сфинкс, в Lucene или Solr.


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

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

Что касается требований к CPU & RAM, выполнение поиска в Lucene не слишком много задач для вашего процессора, хотя индексирование ваших данных, хотя вы не делаете это слишком часто (возможно, один или два раза в день), так что это не так много препятствий.

Он не отвечает на все ваши вопросы, но вкратце, если у вас есть много данных для поиска, и ты хочешь великолепного выступления, тогда я думаю, что Люсин-это определенно путь. Если у вас не будет столько данных для поиска, вы можете также перейти на полнотекстовый поиск в базе данных. Настройка полнотекстового поиска MySQL определенно проще в моей книге.


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

ответ по ссылке ниже подробно несколько вещей о Сфинксе, который также относится к Solr. сравнение полнотекстовой поисковой системы-Lucene, Sphinx, Postgresql, MySQL?

Solr также предоставляет следующие дополнительные особенности:

  1. поддерживает репликацию
  2. несколько ядер (подумайте о них как о отдельных базах данных со своей собственной конфигурацией и собственными индексами)
  3. поиск
  4. выделение ключевых слов (довольно легко сделать в коде приложения, если у вас есть regex-fu; однако, почему бы не позволить специализированному инструменту сделать лучшую работу для вас)
  5. обновить индекс через XML или файл с разделителями
  6. связь с сервером поиска через HTTP (it может даже вернуть JSON, родной PHP / Ruby / Python)
  7. PDF, индексирование документов Word
  8. динамические поля
  9. фасеток
  10. статистические поля
  11. стоп-слова, синонимы и т. д.
  12. больше похоже на это...
  13. непосредственно из базы данных с пользовательскими запросами
  14. автозаполнение
  15. Кэш Autowarming
  16. быстрая индексация (сравните с MySQL полнотекстовый поиск индексирования раз) -- Lucene использует двоичный формат инвертированного индекса.
  17. Boosting (пользовательские правила для повышения релевантности конкретного ключевого слова или фразы и т. д.)
  18. поиск по полю (если пользователь поиска знает поле, которое он хочет найти, они сужают свой поиск, введя поле, затем значение, и только это поле ищется, а не все - гораздо лучший пользовательский опыт)

кстати, есть еще тонны функций; однако я перечислил только функции, которые у меня есть фактически использованный в продукции. Кстати, из коробки MySQL поддерживает #1, #3 и #11 (limited) в списке выше. Для функций, которые вы ищете, реляционная база данных не собирается сокращать его. Я бы сразу их исключил.

кроме того, еще одно преимущество заключается в том, что Solr (ну, Lucene на самом деле) является базой данных документов (например, NoSQL), поэтому многие преимущества любой другой базы данных документов могут быть реализованы с помощью Solr. Другими словами, вы можете использовать его не только для поиска (т. е. производительности). Получите творческий с ним:)


Apache Solr


помимо ответа на запросы OP, позвольте мне бросить некоторые идеи на Apache Solr С простое введение to подробная установка и реализация.

Простое Введение


любой, кто имел опыт работы с поисковыми системами выше, или другое двигателей нет в списке - я хотел бы услышать Ваше мнение.

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

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

  • релевантность и ранжирование

на boost помогает вам ранжировать ваши результаты появляются на вершине. Скажите, вы пытаетесь найти имя Джон в поле "имя" и фамилия, и вы хотите дать релевантность "имя".

java -Djetty.port=9091 -jar start.jar

скачать JConnector

этот файл JAR действует как мост между MySQL и JDBC, загрузите независимую версию платформы здесь

после загрузки извлеките папку и скопируйтеmysql-connector-java-5.1.31-bin.jar и вставьте его в lib.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

Создание таблицы MySQL для связи с Apache Solr

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

1.Структура Таблицы

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2.Заполните приведенную выше таблицу

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

попадание в ядро и добавление директив lib

1.Выберите

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.Изменение solrconfig.в XML

добавьте эти две директивы в этот файл..

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

теперь добавьте DIH (Обработчик Импорта Данных)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.Создайте конфигурацию db-data-config.xml-файл

если файл существует, то игнорировать, добавьте эти строки в этот файл. Как вы можете видеть в первой строке, вам нужно предоставить учетные данные вашего MySQL чтобы увидеть, что пошло не так.

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

Indexing Success

Шаг 4: Запуск Запросов Solr

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

вы увидите проиндексированные записи как показано на рисунке.

соответствующего Solr запрос для перечисления всех записи

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

The indexed data

Ну, там идет все 10 индексированных записей. Скажем, нам нужны только имена, начинающиеся с Ja , в этом случае вам нужно нацелить имя столбца solr_name, следовательно, ваш запрос звучит так.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

The JSON data starting with Ja*

вот как ты пишешь Solr запросы. Чтобы узнать больше об этом, проверьте этот красивый статьи.


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

но у него нет удобных операторов поиска, таких как + или и (использует &/!) и я не в восторге от того, как это работает на их сайте документации. Хотя он имеет выделение жирным шрифтом терминов соответствия в фрагментах результатов, алгоритм по умолчанию для которого условия матча не велики. Кроме того, если вы хотите индексировать rtf, PDF, MS Office, вам нужно найти и интегрировать конвертер форматов файлов.

OTOH, это намного лучше, чем текстовый поиск MySQL, который даже не индексирует слова из трех букв или меньше. Это по умолчанию для поиска MediaWiki, и я действительно думаю, что это не хорошо для конечных пользователей:http://www.searchtools.com/analysis/mediawiki-search/

во всех случаях, которые я видел, Lucene / Solr и Сфинкс действительно великий. Они являются твердым кодом и развились со значительными улучшениями в удобстве использования, поэтому инструменты все там, чтобы сделать поиск, который удовлетворяет почти всех.

для SHAILI-SOLR включает в себя библиотеку кода поиска Lucene и имеет компоненты, чтобы быть хорошим автономным поисковой системы.


только мои два цента на этот очень старый вопрос. Я бы очень рекомендовал взглянуть на ElasticSearch.

Elasticsearch-это поисковый сервер на основе Lucene. Он предоставляет распределенную, многофункциональную полнотекстовую поисковую систему с веб-интерфейсом RESTful и документами JSON без схем. Elasticsearch разработан на Java и выпущен в качестве открытого исходного кода на условиях лицензии Apache.

преимущества перед другими FTS (полнотекстовый поиск) движки:

  • RESTful интерфейс
  • улучшенная масштабируемость
  • большие сообщества
  • построенный Lucene разработчики
  • обширная документация
  • много доступны библиотеки с открытым исходным кодом (включая Django)

мы используем эту поисковую систему в нашем проекте и очень довольны этим.


SearchTools-Avi сказал " текстовый поиск MySQL, который даже не индексирует слова из трех букв или меньше."

FYIs, длина слова MySQL fulltext min регулируется с по крайней мере MySQL 5.0. Google "mysql fulltext min length" для простых инструкций.

тем не менее, MySQL fulltext имеет ограничения: во-первых, он становится медленным для обновления, как только вы достигаете миллиона записей или около того ...


Я бы добавил mnoGoSearch в список. Чрезвычайно эффективное и гибкое решение, которое работает как Google: индексатор извлекает данные с нескольких сайтов, вы можете использовать основные критерии или изобретать свои собственные крючки, чтобы иметь максимальное качество поиска. Кроме того, он может получать данные непосредственно из базы данных.

решение сегодня не так известно, но оно удовлетворяет максимальные потребности. Вы можете скомпилировать и установить его или на автономном сервере, или даже на главном сервере, он не нужно столько ресурсов, сколько Solr, так как он написан на C и отлично работает даже на небольших серверах.

в начале вам нужно скомпилировать его самостоятельно, поэтому он требует некоторых знаний. Я сделал крошечный скрипт для Debian, что может помочь. Любые корректировки приветствуются.

Как вы используете Django framework, вы можете использовать или PHP-клиент в середине, или найти решение в Python, я видел некоторые статьи.

и, конечно, mnoGoSearch с открытым исходным кодом, GNU GPL.