ElasticSearch, Sphinx, Lucene, Solr, Xapian. Что подходит для какого использования? [закрыто]


431

В настоящее время я смотрю на другие методы поиска, а не на огромный запрос SQL. Недавно я увидел упругой поиск и поиграл с whoosh (реализация поисковой системы на Python).

Можете ли вы привести причины для вашего выбора (ов)?





167
Я действительно не понимаю людей, которые закрывают такой КОНСТРУКТИВНЫЙ вопрос. Такие вопросы действительно важны ...
Gizzmo

2
Это тоже движущийся целевой вопрос.
amirouche

Ответы:


787

Как создатель 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 имеет гораздо больше возможностей, чем просто распространение. Он на самом деле построен с учетом облака. Вы можете проверить список возможностей на сайте.


38
«Вы знаете, для поиска». +1 для прокси Hudsucker. Кроме того, я заинтригован программным обеспечением;)
Шаббироб

7
Кроме того, видео было действительно хорошо сделано. Вы должны добавить еще несколько из них!
Шаббироб

5
Хорошо, я обнаружил, что я могу использовать эластичный поиск бесплатно с heroku, в отличие от использования чего-то вроде solr, который стоит денег ...
hellomello

3
ElasticSearch использует большую 230 МБ оперативной памяти на 64-битной Ubuntu после новой установки без данных. Мне бы очень хотелось, чтобы Elasticsearch мог работать на меньших VPS, таких как PostgreSQL или Redis.
Xeoncross

@Xeoncross, как тебе удалось заставить это работать? У меня 1 Гб оперативной памяти VPS, я всегда получаю не могу выделить ошибку памяти ..
Мохаммед Нурельдин

67

Я использовал Sphinx, Solr и Elasticsearch. Solr / Elasticsearch строятся поверх Lucene. Он добавляет много общих функций: API веб-сервера, фасетирование, кэширование и т. Д.

Если вы хотите просто настроить полнотекстовый поиск, Sphinx - лучший выбор.

Если вы хотите настроить поиск вообще, Elasticsearch и Solr - лучший выбор. Они очень расширяемые: вы можете написать свои собственные плагины, чтобы настроить результат оценки.

Некоторые примеры использования:

  • Сфинкс: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github

63

Мы регулярно используем 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, которые интегрируют его в более крупные фреймворки.

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

1
Я никогда не использовал Xapian. Это похоже на прекрасную библиотеку поиска, чьи возможности находятся на одном уровне с функциями Lucene. Опять же, наиболее важными являются ваши приложения, среда, в которой вы хотите, чтобы поисковая система работала, ваше знание языка реализации (C ++ в поиске Xapian, с привязками ко многим другим языкам) и насколько настраиваемым является движок.
Юваль Ф

21

Мы используем Sphinx в проекте вертикального поиска с 10.000.000+ записей MySql и более 10 различных баз данных. Он получил отличную поддержку MySQL и высокую производительность при индексировании, исследования идут быстро, но, возможно, немного меньше, чем Lucene. Однако это правильный выбор, если вам нужно быстро индексировать каждый день и использовать базу данных MySQL.



13

Мой 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)

Вы пробовали сфинкс или эластичный поиск?
Дзен

2
@dzen это Сфинкс; он использует запрос MySQL для сравнения скорости выполнения запроса.
mr.b

8

Единственное сравнение производительностиasticsearch и solr, которое мне удалось найти, находится здесь:

Solr vsasticsearch Deathmatch!


1
это плохо он не представляет комментарии! см это обсуждение: groups.google.com/a/elasticsearch.com/group/users/browse_thread/...
Karussell

1
-1 потому что "Мой комментарий ожидает модерации." и другие тоже видят ссылку на группы Google выше
Karussell

1
-1, более года спустя, комментарии в этой ветке запрещены, я бы серьезно подумал, чтобы полностью их игнорировать.
JAR.JAR.beans

7

Люсена хороша и все такое, но их набор стоп-слов ужасен. Мне пришлось вручную добавить тонну стоп-слов в StopAnalyzer.ENGLISH_STOP_WORDS_SET, чтобы получить его где-нибудь пригодного для использования.

Я не использовал Sphinx, но я знаю, что люди клянутся его скоростью и почти волшебным соотношением «простота настройки и потрясающая».


7

Попробуйте Indextank.

Как и в случае упругого поиска, было задумано, что его гораздо проще использовать, чем lucene / solr. Он также включает в себя очень гибкую систему подсчета очков, которую можно настроить без переиндексации.


забивать можно и во время выполнения с помощью solr
Karussell

теперь нет больше посторонних
Karussell

4
LinkdenIn с открытым исходным кодом IndexTank, github.com/linkedin/indextank-engine
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.