ElasticSearch,狮身人面像,Lucene,Solr,Xapian。 哪个适合哪种用法?

我目前正在寻找其他search方法,而不是有一个巨大的SQL查询。 我最近看到了elasticsearch,并与whoosh (search引擎的Python实现)一起玩。

你能给出你select的理由吗?

作为ElasticSearch的创build者,也许我可以给你一些推理,为什么我继续前进并创build它。

使用纯Lucene是具有挑战性的。 如果你希望它能够很好地运行,还有很多东西需要注意,它也是一个库,所以没有分布式的支持,它只是一个你需要维护的embedded式Java库。

在Lucene的可用性方面,我回到了现在(近6年),创build了Compass。 其目的是简化使用Lucene,并使日常Lucene更简单。 我一次又一次地碰到的是能够分配Compass的要求。 我开始从Compass内部开始工作,整合了GigaSpaces,Coherence和Terracotta等数据网格解决scheme,但这还不够。

在其核心,分布式的Lucene解决scheme需要被分割。 而且,随着HTTP和JSON作为无处不在的API的发展,这意味着可以很容易地使用具有不同语言的许多不同系统的解决scheme。

这就是为什么我继续创buildElasticSearch。 它有一个非常先进的分布式模型,本质上讲JSON,并展示了许多高级的search特性,所有这些都通过JSON DSL无缝地expression出来。

Solr也是通过HTTP公开一个索引/search服务器的解决scheme,但是我认为ElasticSearch提供了一个非常优越的分布式模型和易用性(虽然目前缺乏一些searchfunction,但是不是很长时间,情况下,计划是将所有的Compassfunction放入ElasticSearch)。 当然,我有偏见,因为我创build了ElasticSearch,所以您可能需要检查自己。

至于狮身人面像,我没有使用它,所以我不能评论。 我可以推荐的是在Sphinx论坛的这个线程 ,我认为这是ElasticSearch的优秀分布式模型。

当然,ElasticSearch有更多的function,然后才分发。 它实际上是build立在云的基础上的。 您可以检查网站上的function列表。

我们经常使用Lucene来索引和search数以千万计的文档。 search速度足够快,我们使用不需要很长时间的增量更新。 这确实需要我们一些时间来到这里。 Lucene的优势在于其可扩展性,多种function和开发人员的活跃社区。 使用裸露的Lucene需要Java编程。

如果你重新开始,Lucene系列中的工具是Solr ,它比裸露的Lucene更容易build立,并且几乎拥有Lucene的全部function。 它可以轻松导入数据库文件。 Solr是用Java编写的,所以对Solr的任何修改都需要Java的知识,但是只要调整configuration文件就可以做很多事情。

我也听说过狮身人面像的好东西,特别是与MySQL数据库结合使用。 虽然没有使用过。

国际海事组织,你应该select:

  • 所需的function – 例如,你需要一个法语词干吗? Lucene和Solr有一个,我不知道其他人。
  • 精通实现语言 – 如果您不了解Java,请勿触摸Java Lucene。 你可能需要用C ++来完成Sphinx的工作。 Lucene也被移植到其他 语言 。 如果你想扩展search引擎,这是最重要的。
  • 易于实验 – 我相信Solr在这方面是最好的。
  • 与其他软件接口 – Sphinx与MySQL有良好的接口。 Solr支持ruby,XML和JSON接口作为RESTful服务器。 Lucene只允许你通过Java编程访问。 Compass和Hibernate Search是Lucene的封装,将其集成到更大的框架中。

我已经使用了狮身人面像,Solr和Elasticsearch。 Solr / elasticsearchbuild立在Lucene之上。 它增加了许多常见的function:Web服务器API,分面,caching等。

如果你只想要一个简单的全文search设置,狮身人面像是一个更好的select。

如果你想自定义你的search,elasticsearch和solr是更好的select。 它们非常具有可扩展性:您可以编写自己的插件来调整结果评分。

一些示例用法:

  • 狮身人面像:craigslist.org
  • Solr:Cnet,Netflix,digg.com
  • Elasticsearch:Foursquare,Github

我们在垂直search项目中使用Sphinx,包含10.000.000多个MySqllogging和10多个不同的数据库。 它对MySQL的支持非常好,在索引上性能很高,研究速度很快,但比Lucene还要less一些。 但是,如果您需要快速索引每天并使用MySQL数据库,这是正确的select。

一个比较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 } 

testing脚本:

 <?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) 

Lucene很好,但是他们的停用词很糟糕。 我不得不手动添加大量停止词到StopAnalyzer.ENGLISH_STOP_WORDS_SET只是为了让它接近可用。

我没有使用狮身人面像,但我知道人们发誓,它的速度和接近神奇的“易于安装到迷人”的比例。

尝试indextank。

就弹性search而言,它被认为比lucene / solr更容易使用。 它还包括非常灵活的评分系统,可以进行调整,无需重新索引。

迄今为止我所能find的唯一的elasticsearch vs solr性能比较如下:

Solr与elasticsearch Deathmatch!