Сравнение полнотекстового поискового движка - Lucene, Sphinx, Postgresql, MySQL?

282

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

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

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

  • Sphinx

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

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

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

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

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

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

  • 25
    2 ¢: полнотекстовый поиск MySQL и транзакции (в настоящее время) являются взаимоисключающими. Для полнотекстовых индексов MySQL требуется тип таблицы MyISAM, который не поддерживает транзакции. (В отличие от типа таблицы InnoDB, которая поддерживает транзакции, но не полнотекстовые индексы.)
  • 1
    PostgreSQL полнотекстовый поиск, Tsearch не поддерживает поиск по фразе. Тем не менее, он находится в списке TODO sai.msu.su/~megera/wiki/FTS_Todo .
Показать ещё 3 комментария
Теги:
lucene
full-text-search
sphinx

8 ответов

166
Лучший ответ

Приятно видеть, что кто-то звонит о Люцене, потому что я понятия не имею об этом.

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

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

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

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

  • 0
    Sphinx позволяет обновлять отдельные атрибуты элементов в текущих индексах, но не удалять / обновлять полные записи.
  • 0
    sphinx RT позволяет вам делать частичные обновления / удаления. это на ранней стадии, но уже [почти] работает. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
Показать ещё 4 комментария
76

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

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

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

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

  • 10
    По сравнению со сфинксом, люценция слишком медленная и громоздкая. Я использовал оба в своем проекте, и я, наконец, остановился на сфинксе. Lucence в Java, и он требует гораздо больше ресурсов процессора и оперативной памяти, чем Sphinx.
  • 25
    Я должен не согласиться здесь. Lucene молниеносно, если вы строите правильный индекс. Вы можете сделать сложный запрос для миллионов записей всего за пару миллисекунд. Вам просто нужно знать, что вы делаете. А Люсена в Яве ... ваша точка зрения? Также есть порт .NET, кстати, Lucene .NET.
Показать ещё 7 комментариев
58

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

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

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

  • Поддержка репликации
  • Несколько ядер (подумайте об этом как о отдельных базах данных с собственной конфигурацией и собственными индексами)
  • Логические поиски
  • Выделение ключевых слов (довольно легко сделать в коде приложения, если у вас есть regex-fu, но почему бы не позволить специализированному инструменту лучше работать для вас)
  • Обновить индекс через XML или файл с разделителями
  • Общайтесь с сервером поиска через HTTP (он может даже вернуть Json, Native PHP/Ruby/Python)
  • PDF, индексирование документов Word
  • Динамические поля
  • Грани
  • Совокупные поля
  • Остановить слова, синонимы и т.д.
  • Подробнее...
  • Индекс непосредственно из базы данных с пользовательскими запросами
  • Авто-предложить
  • Кэш-автоволнение
  • Быстрая индексация (сравните с временем индексирования полнотекстового поиска MySQL) - Lucene использует двоичный инвертированный индексный формат.
  • Boosting (настраиваемые правила для повышения релевантности определенного ключевого слова или фразы и т.д.).
  • Полевые поиски (если поисковый пользователь знает поле, которое он/она хочет искать, они сужают свой поиск, вводя поле, затем значение, и ТОЛЬКО это поле ищет, а не все - намного лучше, чем пользователь)

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

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

  • 0
    Sphinx также поддерживает репликацию нескольких ядер Булевы поиски Подсветка ключевых слов Обновление индекса с помощью XML или файла с разделителями - PDF, индексирование документов Word (с помощью XML) Фасеты Стоп-слова, синонимы и т. Д. Индексируйте напрямую из базы данных с помощью пользовательских запросов Автоматическое предложение быстро Индексирование Ускорение полевых поисков О динамических полях Агрегатные поля Кэш Автоподогрев Я просто не знаю
51

Apache Solr


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

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


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

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

Solr отлично работает в веб-приложениях High Traffic (я где-то читал, что он не подходит для этого, но я поддерживаю этот оператор). Он использует ОЗУ, а не ЦП.

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

boost помогает вам оценивать результаты, которые отображаются вверху. Скажем, вы пытаетесь найти имя john в полях firstname и lastname, и хотите присвоить значение первому полю, тогда вам нужно повысить вверх по первому полю, как показано.

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

Как вы можете видеть, поле firstname увеличено со счетом 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. Django выходит за рамки.

Предполагая, что вы находитесь в среде 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 запускался в фон)

Чтобы проверить, успешно ли выполняется Apache Solr, посетите этот URL-адрес в браузере. 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.Table

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>

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

4. Модифицируйте файл schema.xml

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

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

Реализация

Индексация

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

Шаг 1: перейдите на панель администрирования Solr

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

Изображение 855

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

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

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

Изображение 856

Изобразительное, никаких ошибок. Мы рады идти. Выберем collection1 из списка, как показано, и выберите Dataimport

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

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

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

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

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

Изображение 857

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

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

Изображение 858

Шаг 4: Выполнение запросов Solr

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

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

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

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

Изображение 859

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

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

Изображение 860

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

  • 3
    @Downvoter, не стесняйтесь комментировать или редактировать этот ответ, и аргументация в пользу downvote также поможет другим.
  • 4
    это один из самых полных и хорошо организованных постов, которые я видел на SO. Хорошая работа.
25

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

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

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

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

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

  • 1
    Я считаю, что при полнотекстовом поиске PostgreSQL вы имеете в виду Tsearch . Но Tsearch не поддерживает поиск по фразе. Это все еще в их списке TODO sai.msu.su/~megera/wiki/FTS_Todo .
  • 1
    Только что провёл кучу тестов по полнотекстовому поиску в Postgres 9.0; был разочарован, обнаружив, что текст на французском языке не соответствует, если пользователь забывает правильно расставить акценты. Сопоставление форм слов неоднозначно - например, в английском языке «say» не соответствует тексту, содержащему «said». В целом довольно впечатляюще, хотя для интегрированной функции для всех протестированных языков (en, fr, ru)
Показать ещё 4 комментария
18

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

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

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

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

10

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

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

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

2

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню