Решение Elasticsearch, Sphinx В Лудене, Гумз, Приходит Xapian. Что подходит для какого использования? [закрытый]



в настоящее время я смотрю на другие методы поиска, а не на огромный SQL-запрос.
Я видел elasticsearch недавно и играл с дзынь! (реализация Python поисковой системы).



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

784   9  

9 ответов:

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

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

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

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

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

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

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

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

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

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

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

ИМО, вы должны выбрать по к:

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

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

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

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

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

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

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

мой сфинкс.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)

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

Solr против elasticsearch Deathmatch!

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

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

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

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

Comments

    Ничего не найдено.