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

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

Вопрос

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

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Sphinx: craigslist.org
  • Solr: Cnet, Netflix, Digg.com
  • Elasticsearch: Foursquare, GitHub

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

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

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

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

  • Требуемая функциональность - например, вам нужен французский ствол? У Лусена и Солра есть один, я не знаю о других.
  • Навыки языка реализации - не трогайте Java Lucene, если вы не знаете Java. Вам может понадобиться C ++, чтобы делать вещи с Sphinx. Лусен также был перенесен в Другой языки. Анкет Это в основном важно, если вы хотите расширить поисковую систему.
  • Простота экспериментов - я считаю, что Solr лучше всего в этом аспекте.
  • Взаимодействие с другим программным обеспечением - Sphinx имеет хороший интерфейс с MySQL. SOLR поддерживает интерфейсы Ruby, XML и JSON в качестве сервера RESTFUL. Lucene дает вам программный доступ только через Java. Компас а также Священное поиск являются обертками Lucene, которые интегрируют его в более крупные рамки.

Мы используем Sphinx в проекте вертикального поиска с 10.000.000 + из записей MySQL и 10+ различной базы данных. У него очень отличная поддержка для MySQL и высокой производительности при индексации, исследования быстрые, но, возможно, немного меньше, чем Lucene. Однако это правильный выбор, если вам нужно быстро индексировать каждый день и использовать DB 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 ]

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

Единственное сравнение производительности Elasticsearch и Solr, которое я смог найти до сих пор, здесь:

Solr против Elasticsearch Deathmatch!

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

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

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

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

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