Answers:
作为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不仅具有分布式功能,还具有更多功能。它实际上是在考虑云的情况下构建的。您可以在网站上查看功能列表。
我们定期使用Lucene索引和搜索数千万个文档。搜索速度足够快,而且我们使用的更新不会花费很长时间。我们确实花了一些时间才能到达这里。Lucene的优势在于它的可伸缩性,广泛的功能和活跃的开发人员社区。使用裸露的Lucene需要使用Java进行编程。
如果您从头开始,那么Lucene家族中适合您的工具就是Solr,它比裸露的Lucene容易安装,并且几乎具有Lucene的全部功能。它可以轻松导入数据库文档。Solr是用Java编写的,因此Solr的任何修改都需要Java知识,但是您只需调整配置文件就可以完成很多工作。
我也听说过有关Sphinx的好消息,尤其是与MySQL数据库结合使用时。不过,还没有使用过。
IMO,您应该根据以下条件进行选择:
我的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性能比较是在这里:
尝试indextank。
就弹性搜索而言,它被认为比lucene / solr更容易使用。它还包括非常灵活的评分系统,无需重新编制索引即可进行调整。