ElasticSearch,Sphinx,Lucene,Solr,Xapian。哪种适合哪种用法?[关闭]


431

我目前正在寻找其他搜索方法,而不是拥有庞大的SQL查询。我最近看过Elasticsearch,并玩过whoosh(搜索引擎的Python实现)。

您能给出选择理由吗?


8
狮身人面像VS Solr的比较:stackoverflow.com/questions/1284083/...
毛里西奥·雅伯

9
露西恩(Lucene)vs索尔(Solr):stackoverflow.com/questions/1400892/…–
毛里西奥·谢弗


167
我真的不明白那些解决这样一个建设性问题的人。这样的问题真的很重要……
Gizzmo 2014年

2
那些也是移动目标的问题。
amirouche 2015年

Answers:


787

作为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不仅具有分布式功能,还具有更多功能。它实际上是在考虑云的情况下构建的。您可以在网站上查看功能列表。


38
“你知道,为了搜索”。+1为Hudsucker代理。另外,我对软件也很感兴趣;)
Shabbyrobe 2010年

7
另外,视频确实做得很好。您应该添加更多这些!
Shabbyrobe 2010年

5
很好,我发现我可以在heroku上免费使用elasticsearch,而不是使用诸如solr之类的花费金钱的东西……
hellomello

3
在没有数据的情况下,全新安装后,ElasticSearch在64位Ubuntu上使用230 MB的较大RAM。我真的希望Elasticsearch可以在较小的VPS(如PostgreSQL或Redis)上运行。
Xeoncross

@Xeoncross您如何设法使其正常工作?我有1GB内存VPS,我总是无法分配内存错误..
穆罕默德Noureldin

67

我已经使用了Sphinx,Solr和Elasticsearch。Solr / Elasticsearch建立在Lucene之上。它添加了许多常用功能:Web服务器api,构面,缓存等。

如果您只想进行简单的全文搜索设置,Sphinx是一个更好的选择。

如果您想完全自定义搜索,Elasticsearch和Solr是更好的选择。它们非常可扩展:您可以编写自己的插件来调整结果评分。

一些示例用法:

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

63

我们定期使用Lucene索引和搜索数千万个文档。搜索速度足够快,而且我们使用的更新不会花费很长时间。我们确实花了一些时间才能到达这里。Lucene的优势在于它的可伸缩性,广泛的功能和活跃的开发人员社区。使用裸露的Lucene需要使用Java进行编程。

如果您从头开始,那么Lucene家族中适合您的工具就是Solr,它比裸露的Lucene容易安装,并且几乎具有Lucene的全部功能。它可以轻松导入数据库文档。Solr是用Java编写的,因此Solr的任何修改都需要Java知识,但是您只需调整配置文件就可以完成很多工作。

我也听说过有关Sphinx的好消息,尤其是与MySQL数据库结合使用时。不过,还没有使用过。

IMO,您应该根据以下条件进行选择:

  • 所需的功能-例如,您是否需要法语词干分析器?Lucene和Solr有一个,我不知道其他人。
  • 熟练的实现语言-如果您不懂Java,请不要接触Java Lucene。您可能需要C ++才能使用Sphinx。Lucene还被移植到其他 语言中。如果您想扩展搜索引擎,这是最重要的。
  • 易于实验-我相信Solr在这方面是最好的。
  • 与其他软件的接口-Sphinx与MySQL具有良好的接口。Solr支持ruby,XML和JSON接口作为RESTful服务器。Lucene仅允许您通过Java进行编程访问。CompassHibernate Search是Lucene的包装,将其集成到更大的框架中。

1
您提出了一个重要的概念,即搜索引擎必须具有适应性。
dzen

1
我从未使用过Xapian。它看起来像一个不错的搜索库,其功能与Lucene的功能相当。同样,最重要的事情是您的应用程序需求,您希望搜索引擎运行的环境,您对实现语言的熟练程度(Xapian搜索中的C ++,具有与许多其他语言的绑定)以及引擎的可自定义性。
Yuval F

21

我们在具有10.000.000 + MySql记录和10+不同数据库的Vertical Search项目中使用Sphinx。它对MySQL具有非常出色的支持,并且在索引编制方面具有高性能,研究速度很快,但可能比Lucene少。但是,如果您每天都需要快速索引并使用MySQL数据库,那么这是正确的选择。



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)

您是否尝试过狮身人面像或elasticsearch?
2012年

2
@dzen这是狮身人面像;他使用mysql查询作为查询执行速度的比较。
mr.b 2012年

8

到目前为止,我唯一能找到的elasticsearch与solr性能比较是在这里:

Solr vs elasticsearch死斗!


1
那是一个坏人。他没有发表评论!请参阅以下讨论:groups.google.com/a/elasticsearch.com/group/users/browse_thread/…–
Karussell

1
-1,因为“我的评论正在等待审核。” 其他人也可以看到上方的Google
网上论坛

1
-1,一年多以后,该线程不允许发表评论,我将认真考虑完全忽略它。
–'JAR.JAR.beans

7

Lucene一切都很好,但是他们的停用词集却很糟糕。我必须向StopAnalyzer.ENGLISH_STOP_WORDS_SET手动添加大量停用词,以使它接近可用位置。

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


7

尝试indextank。

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


得分可以在使用Solr运行时tweek太
Karussell

现在还没有indextank了
Karussell

4
LinkdenIn开源IndexTank,github.com
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.