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