ElasticSearch, Sphinx, Lucene, Solr, Xapian. Что подходит для какого использования?
9 ответов
Как создатель ElasticSearch, может быть, я расскажу вам, почему я пошел вперед и создал его в первую очередь:).
Использование чистого Lucene является сложной задачей. Есть много вещей, о которых вам нужно позаботиться, если вы хотите, чтобы они действительно хорошо работали, а также, это библиотека, поэтому нет распределенной поддержки, это просто встроенная библиотека Java, которую вы должны поддерживать.
С точки зрения юзабилити Lucene, еще когда (почти 6 лет) я создал Compass. Его целью было упростить использование Lucene и сделать повседневную Lucene проще. Снова и снова я сталкивался с требованием иметь возможность распространять Compass. Я начал работать над этим изнутри Compass, интегрируя его с такими сеточными решениями, как GigaSpaces, Coherence и Terracotta, но этого недостаточно.
По своей сути распределенное решение Lucene нуждается в защите. Кроме того, с развитием HTTP и JSON в качестве вездесущих API, это означает, что решение, которое можно легко использовать для множества различных систем с разными языками.
Вот почему я пошел вперед и создал ElasticSearch. У него очень продвинутая распределенная модель, он говорит на родном языке JSON и предоставляет множество расширенных функций поиска, все из которых легко выражаются с помощью JSON DSL.
Solr также является решением для предоставления доступа серверу индексирования / поиска через HTTP, но я бы сказал, что ElasticSearch предоставляет гораздо лучшую распределенную модель и простоту использования (хотя в настоящее время не хватает некоторых функций поиска, но ненадолго и в любом случае). В этом случае планируется включить все функции Compass в ElasticSearch). Конечно, я предвзят, поскольку я создал ElasticSearch, поэтому вам, возможно, придется проверить это самостоятельно.
Что касается Сфинкса, я им не пользовался, поэтому не могу комментировать. Я могу сослаться на вас в этой теме на форуме Sphinx, которая, я думаю, подтверждает превосходную распределенную модель ElasticSearch.
Конечно, ElasticSearch имеет гораздо больше возможностей, чем просто распространение. Он на самом деле построен с учетом облака. Вы можете проверить список возможностей на сайте.
Я использовал Sphinx, Solr и Elasticsearch. Solr/Elasticsearch строятся поверх Lucene. Он добавляет много общих функций: API веб-сервера, фасетирование, кеширование и т. Д.
Если вы хотите иметь простую настройку полнотекстового поиска, Sphinx - лучший выбор.
Если вы хотите настроить поиск вообще, Elasticsearch и Solr - лучший выбор. Они очень расширяемые: вы можете написать свои собственные плагины для настройки оценки результатов.
Некоторые примеры использования:
- Сфинкс: craigslist.org
- Solr: Cnet, Netflix, digg.com
- Elasticsearch: Foursquare, Github
Мы регулярно используем Lucene для индексации и поиска десятков миллионов документов. Поиск выполняется достаточно быстро, и мы используем дополнительные обновления, которые не занимают много времени. Нам потребовалось некоторое время, чтобы добраться сюда. Сильными сторонами Lucene являются его масштабируемость, большой набор функций и активное сообщество разработчиков. Использование голого Lucene требует программирования на Java.
Если вы начинаете с нуля, для вас в семействе Lucene вы найдете инструмент Solr, который гораздо проще настроить, чем голый Lucene, и обладает почти всей мощью Lucene. Он может легко импортировать документы из базы данных. Solr написаны на Java, поэтому любая модификация Solr требует знания Java, но вы можете многое сделать, просто настроив файлы конфигурации.
Я также слышал хорошие вещи о Sphinx, особенно в сочетании с базой данных MySQL. Не использовал это, все же.
ИМО, вы должны выбрать в соответствии с:
- Требуемая функциональность - например, вам нужен французский стеммер? У Lucene и Solr есть один, я не знаю о других.
- Знание языка реализации - не трогайте Java Lucene, если вы не знаете Java. Вам может понадобиться C++ для работы с Sphinx. Lucene также был перенесен на другие языки. Это особенно важно, если вы хотите расширить поисковую систему.
- Простота экспериментов - я считаю, что Solr является лучшим в этом аспекте.
- Взаимодействие с другим программным обеспечением - Sphinx имеет хороший интерфейс с MySQL. Solr поддерживает интерфейсы ruby, XML и JSON в качестве сервера RESTful. Lucene дает вам только программный доступ через Java. Compass и Hibernate Search являются оболочками Lucene, которые интегрируют его в более крупные фреймворки.
Мы используем Sphinx в проекте вертикального поиска с 10.000.000 + записей MySql и более 10 различных баз данных. Он получил отличную поддержку MySQL и высокую производительность при индексировании, исследования идут быстро, но, возможно, немного меньше, чем Lucene. Однако это правильный выбор, если вам нужно быстро индексировать каждый день и использовать базу данных MySQL.
Мой sphinx.conf
source post_source
{
type = mysql
sql_host = localhost
sql_user = ***
sql_pass = ***
sql_db = ***
sql_port = 3306
sql_query_pre = SET NAMES utf8
# query before fetching rows to index
sql_query = SELECT *, id AS pid, CRC32(safetag) as safetag_crc32 FROM hb_posts
sql_attr_uint = pid
# pid (as 'sql_attr_uint') is necessary for sphinx
# this field must be unique
# that is why I like sphinx
# you can store custom string fields into indexes (memory) as well
sql_field_string = title
sql_field_string = slug
sql_field_string = content
sql_field_string = tags
sql_attr_uint = category
# integer fields must be defined as sql_attr_uint
sql_attr_timestamp = date
# timestamp fields must be defined as sql_attr_timestamp
sql_query_info_pre = SET NAMES utf8
# if you need unicode support for sql_field_string, you need to patch the source
# this param. is not supported natively
sql_query_info = SELECT * FROM my_posts WHERE id = $id
}
index posts
{
source = post_source
# source above
path = /var/data/posts
# index location
charset_type = utf-8
}
Тестовый скрипт:
<?php
require "sphinxapi.php";
$safetag = $_GET["my_post_slug"];
// $safetag = preg_replace("/[^a-z0-9\-_]/i", "", $safetag);
$conf = getMyConf();
$cl = New SphinxClient();
$cl->SetServer($conf["server"], $conf["port"]);
$cl->SetConnectTimeout($conf["timeout"]);
$cl->setMaxQueryTime($conf["max"]);
# set search params
$cl->SetMatchMode(SPH_MATCH_FULLSCAN);
$cl->SetArrayResult(TRUE);
$cl->setLimits(0, 1, 1);
# looking for the post (not searching a keyword)
$cl->SetFilter("safetag_crc32", array(crc32($safetag)));
# fetch results
$post = $cl->Query(null, "post_1");
echo "<pre>";
var_dump($post);
echo "</pre>";
exit("done");
?>
Пример результата:
[array] =>
"id" => 123,
"title" => "My post title.",
"content" => "My <p>post</p> content.",
...
[ and other fields ]
Время запроса сфинкса:
0.001 sec.
Время запроса сфинкса (1k одновременно):
=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)
Время запроса MySQL:
"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.
Время запроса MySQL (1k одновременно):
"SELECT * FROM my_posts WHERE id = 123;"
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)
Единственное сравнение производительности asticsearch и solr, которое мне удалось найти, находится здесь:
Люсена хороша и все такое, но их набор стоп-слов ужасен. Мне пришлось вручную добавить тонну стоп-слов в StopAnalyzer.ENGLISH_STOP_WORDS_SET, чтобы получить его где-нибудь пригодного для использования.
Я не использовал Sphinx, но я знаю, что люди клянутся его скоростью и почти волшебным соотношением "простота настройки и потрясающая".
Попробуйте Indextank.
Как и в случае упругого поиска, он был задуман как гораздо более простой в использовании, чем lucene/solr. Он также включает в себя очень гибкую систему подсчета очков, которую можно настроить без переиндексации.