我目前正在寻找其他搜索方法,而不是拥有庞大的SQL查询。 我最近看到了elasticsearch并使用了whoosh(搜索引擎的Python实现)。
你能说明你的选择理由吗?
答案 0 :(得分:775)
作为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,我还没有用过它,所以我无法发表评论。我可以推荐你的是this thread at Sphinx forum,我认为它证明了ElasticSearch的优秀分布式模型。
当然,ElasticSearch除了分发之外还有许多其他功能。它实际上是以云计算而构建的。您可以查看网站上的功能列表。
答案 1 :(得分:64)
我使用过Sphinx,Solr和Elasticsearch。 Solr / Elasticsearch建立在Lucene之上。它增加了许多常用功能:Web服务器api,分面,缓存等。
如果您想要一个简单的全文搜索设置,Sphinx是一个更好的选择。
如果您想自定义搜索,Elasticsearch和Solr是更好的选择。它们非常易于扩展:您可以编写自己的插件来调整结果评分。
一些示例用法:
答案 2 :(得分:62)
我们经常使用Lucene索引和 搜索数以千万计的文档。 搜索速度很快,我们使用 不采取的增量更新 很长时间。它花了我们一些时间 到这里来优点 Lucene是它的可扩展性,很大 功能范围和活跃 开发者社区。使用裸露 Lucene需要用Java编程。
如果你重新开始,Lucene系列中的工具是Solr,它比裸露的Lucene更容易设置,并且几乎具有Lucene的全部功能。它可以轻松导入数据库文档。 Solr是用Java编写的,因此Solr的任何修改都需要Java知识,但只需调整配置文件就可以做很多事情。
我也听说过关于Sphinx的好消息,特别是与MySQL数据库结合使用。但是没有用过它。
IMO,你应该根据:
选择答案 3 :(得分:20)
我们在垂直搜索项目中使用Sphinx,其中包含10.000.000 +的MySql记录和10多个不同的数据库。 它对MySQL有很好的支持和索引的高性能,研究速度快但可能比Lucene少一点。 但是,如果您需要每天快速编制索引并使用MySQL数据库,那么它是正确的选择。
答案 4 :(得分:18)
答案 5 :(得分:13)
我的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)
答案 6 :(得分:8)
到目前为止我能找到的唯一弹性搜索与solr性能比较是:
答案 7 :(得分:7)
Lucene很好,但他们的停止词设置很糟糕。我不得不手动向StopAnalyzer.ENGLISH_STOP_WORDS_SET添加大量停用词,以使其随处可用。
我没有使用过狮身人面像,但我知道人们发誓它的速度和近乎神奇的“易于设置到令人敬畏”的比例。
答案 8 :(得分:7)
尝试indextank。
作为弹性搜索的例子,它被认为比lucene / solr更容易使用。它还包括非常灵活的评分系统,可以在不重新编制索引的情况下进行调整。