ElasticSearch, Sphinx, Lucene, Solr, Xapian. Что подходит для использования?

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

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

Ответ 1

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

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

С точки зрения удобства использования Lucene, назад (почти через 6 лет) я создал Compass. Его целью было упростить использование Lucene и сделать повседневную Lucene проще. То, что я натолкнулся снова и снова, - это требование иметь возможность распространять Компас. Я начал работать над ним изнутри Compass, интегрировавшись с решениями grid-решений, такими как GigaSpaces, Coherence и Terracotta, но его недостаточно.

По своей сути распределенное решение Lucene должно быть отложено. Кроме того, с продвижением HTTP и JSON в качестве вездесущих API, это означает, что можно легко использовать множество различных систем с разными языками.

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

Solr также является решением для публикации сервера индексирования/поиска по HTTP, но я бы сказал, что ElasticSearch обеспечивает гораздо более высокий уровень распределения модель и простота использования (хотя в настоящее время не хватает некоторых функций поиска, но не надолго, и в любом случае план состоит в том, чтобы получить все функции Compass в ElasticSearch). Конечно, я предвзятый, так как я создал ElasticSearch, поэтому вам, возможно, нужно будет проверить себя.

Что касается Sphinx, я не использовал его, поэтому не могу комментировать. Я могу направить вас на эту тему на форуме Sphinx, который, я думаю, доказывает превосходную распределенную модель ElasticSearch.

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

Ответ 2

Мы регулярно используем Lucene для индексации и  искать десятки миллионов документов.  Поиски достаточно быстры, и мы используем  инкрементные обновления, которые не принимаются  долго. Это заняло у нас некоторое время  чтобы добраться сюда. Сильные стороны  Lucene - это его масштабируемость, большая  диапазон функций и активный  сообщества разработчиков. Использование голой  Lucene требует программирования на Java.

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

Я также хорошо слышал о Sphinx, особенно в сочетании с базой данных MySQL. Однако не использовали его.

IMO, вы должны выбрать в соответствии с:

  • Требуемая функциональность - например, вам нужен французский стволовый? У Lucene и Solr есть один, я не знаю о других.
  • Владение языком реализации - не касайтесь Java Lucene, если вы не знаете Java. Возможно, вам понадобится С++ для работы с Sphinx. Lucene также была перенесена в другие языки. Это в основном важно, если вы хотите расширить поисковую систему.
  • Простота экспериментов - я считаю, что Solr лучше всего в этом аспекте.
  • Взаимодействие с другим программным обеспечением - Sphinx имеет хороший интерфейс с MySQL. Solr поддерживает интерфейсы ruby, XML и JSON в качестве сервера RESTful. Lucene предоставляет вам программный доступ через Java. Compass и Hibernate Search - это обертки Lucene, которые интегрируют это в более крупные рамки.

Ответ 3

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

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

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

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

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, digg.com
  • Elasticsearch: Foursquare, Github

Ответ 4

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

Ответ 6

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

Тест script:

<?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 ]

Время запроса Sphinx:

0.001 sec.

Время запроса Sphinx (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)

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

Единственное сравнение elasticsearch vs solr, которое я смог найти до сих пор, находится здесь:

Solr vs elasticsearch Deathmatch!