В настоящее время я ищу другие методы поиска, а не огромный запрос SQL. Недавно я увидел elasticsearch и играл с whoosh (реализация Python в поисковой системе).
Можете ли вы привести причины для вашего выбора?
В настоящее время я ищу другие методы поиска, а не огромный запрос SQL. Недавно я увидел elasticsearch и играл с whoosh (реализация Python в поисковой системе).
Можете ли вы привести причины для вашего выбора?
Как создатель 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 имеет гораздо больше функций, а затем просто распространяется. Это фактически построено с облаком в виду. Вы можете проверить список функций на сайте.
Мы регулярно используем Lucene для индексации и искать десятки миллионов документов. Поиски достаточно быстры, и мы используем инкрементные обновления, которые не принимаются долго. Это заняло у нас некоторое время чтобы добраться сюда. Сильные стороны Lucene - это его масштабируемость, большая диапазон функций и активный сообщества разработчиков. Использование голой Lucene требует программирования на Java.
Если вы начинаете заново, инструмент для вас в семействе Lucene Solr, который намного проще настроить, чем голый Луцен, и имеет почти всю силу Луцене. Он может легко импортировать документы базы данных. Solr написаны на Java, поэтому любая модификация Solr требует знания Java, но вы можете сделать многое, просто изменив конфигурационные файлы.
Я также хорошо слышал о Sphinx, особенно в сочетании с базой данных MySQL. Однако не использовали его.
IMO, вы должны выбрать в соответствии с:
Я использовал Sphinx, Solr и Elasticsearch. Solr/elasticsearch построены поверх Lucene. Он добавляет много общих функциональных возможностей: веб-сервер api, огранка, кеширование и т.д.
Если вы хотите просто настроить полный текстовый поиск, сфинкс - лучший выбор.
Если вы хотите настроить свой поиск вообще, elasticsearch и solr - лучший выбор. Они очень расширяемы: вы можете создавать свои собственные плагины, чтобы скорректировать результат.
Некоторые примеры использования:
Мы используем Sphinx в проекте с вертикальным поиском с 10.000.000 + записями MySql и 10+ различными базами данных. Он имеет отличную поддержку MySQL и высокую производительность при индексировании, исследования быстрые, но, возможно, немного меньше, чем Lucene. Однако это правильный выбор, если вам нужно быстро индексировать каждый день и использовать MySQL db.
Эксперимент с сравните ElasticSearch и Solr
Мой 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)
Lucene - это хорошо и все, но их набор стоп-слов ужасен. Мне пришлось вручную добавить тонну стоп-слов в StopAnalyzer.ENGLISH_STOP_WORDS_SET, чтобы получить ее где угодно рядом с ней.
Я не использовал Sphinx, но я знаю, что люди клянутся своим быстродействием и почти магическим соотношением "легкость настройки к удивительности".
Попробуйте indextank.
Как и в случае с эластичным поиском, было задумано гораздо легче использовать, чем люцен/солр. Он также включает в себя очень гибкую систему подсчета очков, которая может быть изменена без переиндексации.
Единственное сравнение elasticsearch vs solr, которое я смог найти до сих пор, находится здесь: