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

StackOverflow https://stackoverflow.com/questions/737275

Вопрос

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

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

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

  • Сфинкс

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Апач Солр


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

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


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

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

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

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

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

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

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

Подробнее о Релевантность

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

Скорость невероятно высока, и в этом нет никаких компромиссов.Причина, по которой я переехал в Солр.

Что касается скорости индексации, Солр может также обрабатывать ПРИСОЕДИНЯЕТСЯ из таблиц вашей базы данных.Более высокий и сложный Присоединиться действительно влияет на скорость индексации.Однако огромная ОЗУ config может легко справиться с этой ситуацией.

Чем больше объем оперативной памяти, тем выше скорость индексации Solr.

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

Никогда не пытался интегрировать Солр и Джанго, однако вы можете добиться этого с помощью Стог Сена.Я нашел кое-что интересное Статья на том же самом и вот гитхаб за это.

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

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

Солр's Использование оперативной памяти резко возрастает при полной индексации. Если у вас есть несколько миллиардов записей, вы могли бы разумно использовать дельта-импорт для решения этой ситуации.Как объяснено, Солр это всего лишь решение, близкое к реальному времени.

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

Солр обладает высокой масштабируемостью.Взгляните на Солнечное облако.Некоторые его ключевые особенности.

  • Сегменты (или сегментирование - это концепция распределения индекса между несколькими машинами, скажем, если ваш индекс стал слишком большим)
  • Балансировка нагрузки (если Солрдж используется с Solr cloud, он автоматически заботится о балансировке нагрузки, используя свой механизм циклического перебора)
  • Распределенный Поиск
  • Высокая доступность
  • дополнительные функции, такие как "вы имели в виду?", поиск по теме и т. Д

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


Этот ответ в целом фокусируется на Apache Solr & MySQL - сервер.Django выходит за рамки.

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

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

Приступая к работе

Скачать Apache Solr От здесь.Это была бы версия is 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

Причал доступен внутри папки examples в 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

Запущенный причал в пользовательском порту

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

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

Скачать JConnector

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

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

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

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

Чтобы поместить Солр чтобы использовать, вам необходимо иметь несколько таблиц и данных для поиска.Для этого мы будем использовать MySQL - сервер для создания таблицы и ввода нескольких случайных имен, а затем мы могли бы использовать Солр для подключения к 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>

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

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

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

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

Реализация

Индексирование

Вот где заключается настоящая сделка.Вам нужно выполнить индексацию данных из 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

Отлично, ошибок нет.Мы готовы идти.Давайте выберем коллекция 1 из списка, как показано на рисунке, и выберите Порт данных

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

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

Чтобы сделать это, Выберите полный импорт , и проверьте параметры Чистый и Совершить.Теперь нажмите Выполнить как показано.

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

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

The Data Import Handler

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

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

Indexing Success

Шаг 4:Выполнение запросов 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*

Вот как ты пишешь Солр Запросы.Чтобы узнать больше об этом, ознакомьтесь с этим прекрасным Статья.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top