Сравнение полнотекстового поискового движка - Lucene, Sphinx, Postgresql, MySQL? - PullRequest
303 голосов
/ 10 апреля 2009

Я создаю сайт Django и ищу поисковую систему.

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

  • Lucene / Lucene with Compass / Solr

  • Sphinx

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

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

Критерии выбора:

  • релевантность и рейтинг результата
  • скорость поиска и индексации
  • простота использования и простота интеграции с Django
  • требования к ресурсам - сайт будет размещен на VPS , поэтому в идеале поисковой системе не потребуется много оперативной памяти и процессора
  • масштабируемость
  • дополнительные функции, такие как «Вы имели в виду?», Связанные поиски и т. Д.

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

РЕДАКТИРОВАТЬ: Что касается потребностей в индексации, так как пользователи продолжают вводить данные на сайт, эти данные должны будут индексироваться постоянно. Это не должно быть в режиме реального времени, но в идеале новые данные должны отображаться в индексе с задержкой не более 15-30 минут

Ответы [ 8 ]

163 голосов
/ 10 апреля 2009

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

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

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

Я понятия не имею, насколько это применимо к вашей ситуации, но Эван Уивер сравнил несколько общих параметров поиска Rails (Sphinx, Ferret (порт Lucene для Ruby) и Solr), работает несколько тестов. Наверное, может быть полезно.

Я не изучал глубины полнотекстового поиска MySQL, но я знаю, что он не конкурирует ни по скорости, ни по характеристикам со Sphinx, Lucene или Solr.

82 голосов
/ 10 апреля 2009

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

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

Что касается требований к ЦП и ОЗУ, выполнение поиска в Lucene не слишком загружает ваш ЦП, хотя индексация данных выполняется, хотя вы не делаете это слишком часто (возможно, один или два раза в день), так что не так много препятствий.

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

60 голосов
/ 09 декабря 2010

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

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

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

  1. Поддерживает репликацию
  2. Несколько ядер (представьте, что это отдельные базы данных со своей конфигурацией и собственными индексами)
  3. Булевы поиски
  4. Подсветка ключевых слов (довольно просто сделать в коде приложения, если у вас есть regex-fu; однако, почему бы не позволить специализированному инструменту сделать вашу работу лучше)
  5. Обновить индекс через XML или файл с разделителями
  6. Связь с поисковым сервером по HTTP (он даже может вернуть Json, Native PHP / Ruby / Python)
  7. PDF, индексирование документов Word
  8. Динамические поля
  9. Грань
  10. Совокупные поля
  11. Стоп-слова, синонимы и т. Д.
  12. Больше, как это ...
  13. Индексировать напрямую из базы данных с помощью пользовательских запросов
  14. Автоматический предложить
  15. Cache Autowarm
  16. Быстрая индексация (сравните с временем индексации полнотекстового поиска MySQL) - Lucene использует двоичный формат с инвертированным индексом.
  17. Повышение (пользовательские правила для повышения релевантности определенного ключевого слова или фразы и т. Д.)
  18. Поиск по полям (если пользователь поиска знает поле, которое он / она хочет найти, он сужает свой поиск, набирая поле, затем значение и ТОЛЬКО это поле, в котором выполняется поиск, а не все - гораздо лучший пользовательский опыт)

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

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

57 голосов
/ 19 января 2015

Apache Solr


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

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


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

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

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

  • релевантность и рейтинг результата

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

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Как видите, имя поле равно усилено вверх со счетом 2.

Подробнее о SolrRelevancy

  • скорость поиска и индексирования

Скорость невероятно высока и без компромиссов. Причина, по которой я перешел на Solr .

Что касается скорости индексации, Solr также может обрабатывать JOINS из таблиц вашей базы данных. Более высокий и сложный JOIN влияет на скорость индексации. Однако огромная конфигурация RAM может легко справиться с этой ситуацией.

Чем выше объем ОЗУ, тем выше скорость индексации Solr.

  • простота использования и простота интеграции с Django

Никогда не пытался интегрировать Solr и Django , однако вы можете добиться этого с помощью Haystack . Я нашел кое-что интересное статью , и вот для него github .

  • требования к ресурсам - сайт будет размещен на VPS, поэтому в идеале поисковой системе не потребуется много оперативной памяти и процессора

Solr размножается в ОЗУ, поэтому, если ОЗУ велико, вам не нужно беспокоиться о Solr .

Solr Использование ОЗУ возрастает при полной индексации, если у вас есть несколько миллиардов записей, вы можете разумно использовать импорт Delta для решения этой ситуации. Как было объяснено, Solr - это только решение, близкое к реальному времени .

  • масштабируемость

Solr отлично масштабируется. Посмотрите на SolrCloud . Некоторые ключевые особенности этого.

  • Осколки (или разделение - это концепция распределения индекса по нескольким машинам, например, если ваш индекс слишком велик)
  • Балансировка нагрузки (если Solrj используется с облаком Solr, он автоматически выполняет балансировку нагрузки с помощью механизма Round-Robin)
  • Распределенный поиск
  • Высокая доступность
  • дополнительные функции, такие как «Вы имели в виду?», Похожие запросы и т. Д.

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


В этом ответе широко рассматривается Apache Solr & MySQL . Джанго выходит за рамки.

Предполагая, что вы находитесь в среде LINUX, вы можете перейти к этой статье дальше. (у меня была версия Ubuntu 14.04)

Подробная установка

Начало работы

Скачать Apache Solr с здесь . Это будет версия 4.8.1 . Вы можете скачать новые версии, я нашел эту стабильную.

После загрузки архива распакуйте его в папку по вашему выбору. Скажи .. Downloads или еще как-то .. Так это будет выглядеть Downloads/solr-4.8.1/

По вашему запросу. Перейдите в каталог

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

Так что теперь вы здесь ..

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

Запустите сервер приложений Jetty

Jetty находится в папке примеров в каталоге solr-4.8.1, поэтому перейдите в нее и запустите сервер приложений Jetty.

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

Теперь не закрывайте терминал, сверните его и оставьте в стороне.

(СОВЕТ: используйте & после start.jar, чтобы Jetty Server работал в фон)

Чтобы проверить, работает ли Apache Solr , перейдите по этой ссылке в браузере. http://localhost:8983/solr

Запуск Jetty на пользовательском порту

Он работает на порту 8983 по умолчанию. Вы можете изменить порт здесь или непосредственно в файле jetty.xml.

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 базы данных. Имя базы данных, имя пользователя и пароль.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(СОВЕТ: Вы можете иметь любое количество объектов, но следите за полем идентификатора, если они совпадают, то индексирование будет пропущено. )

4. Изменить файл schema.xml

Добавьте это в schema.xml , как показано ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Осуществление

Индексация

Вот где настоящая сделка. Для использования запросов Solr необходимо выполнить индексацию данных от MySQL до Solr .

Шаг 1. Перейдите в админ-панель Solr

Нажмите URL-адрес http://localhost:8983/solr в своем браузере. Экран открывается так.

This is the main Apache Solr Administration Panel

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

Шаг 2: Проверьте свои журналы

Хорошо, теперь вы здесь, так как вы можете получить много желтых сообщений (ПРЕДУПРЕЖДЕНИЯ). Убедитесь, что у вас нет сообщений об ошибках, отмеченных красным. Ранее в нашей конфигурации мы добавили запрос select в наш db-data-config.xml , скажем, если бы в этом запросе были какие-либо ошибки, он бы появился здесь.

This is the logging section of your Apache Solr engine

Хорошо, без ошибок. Мы в порядке. Давайте выберем collection1 из списка, как изображено, и выберите Dataimport

Шаг 3: DIH (обработчик импорта данных)

Используя DIH, вы будете подключаться к MySQL из Solr через файл конфигурации db-data-config.xml из Solr интерфейс и получить 10 записей из базы данных, которая индексируется на Solr .

Для этого выберите полный импорт и отметьте опции Очистить и Подтвердить . Теперь нажмите Выполнить , как показано.

В качестве альтернативы вы можете использовать прямой запрос full-import , подобный этому ..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

The Data Import Handler

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

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

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 Запросы. Чтобы узнать больше об этом, проверьте эту прекрасную статью .

28 голосов
/ 18 сентября 2009

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

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

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

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

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

22 голосов
/ 21 января 2014

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

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

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

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

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

10 голосов
/ 28 сентября 2009

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

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

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

2 голосов
/ 21 июня 2013

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

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

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

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

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

...