ElasticSearch、Sphinx、Lucene、Solr、Xapian。哪个适合哪个用途? [关闭]

Posted

技术标签:

【中文标题】ElasticSearch、Sphinx、Lucene、Solr、Xapian。哪个适合哪个用途? [关闭]【英文标题】:ElasticSearch, Sphinx, Lucene, Solr, Xapian. Which fits for which usage? [closed] 【发布时间】:2011-01-17 07:32:48 【问题描述】:

我目前正在寻找其他搜索方法,而不是使用庞大的 SQL 查询。 我最近看到了elasticsearch,并玩弄了whoosh(搜索引擎的Python实现)。

你能给出你选择的理由吗?

【问题讨论】:

Sphinx 与 Solr 比较:***.com/questions/1284083/… Lucene 与 Solr:***.com/questions/1400892/… 嗖嗖诉 Solr:***.com/questions/3226596/… 我真的不明白关闭这样一个建设性问题的人。这样的问题真的很重要…… 那些也是移动目标问题。 【参考方案1】:

作为 ElasticSearch 的创建者,也许我可以给你一些理由,说明我为什么要继续创建它:)。

使用纯 Lucene 具有挑战性。如果你想让它真正表现良好,你需要注意很多事情,而且它是一个库,所以没有分布式支持,它只是一个你需要维护的嵌入式 Java 库。

就 Lucene 的可用性而言,早在我创建 Compass 的时候(差不多 6 年了)。它的目的是简化 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 的功能远不止分布式。它实际上是在考虑云的情况下构建的。您可以在网站上查看功能列表。

【讨论】:

“你知道,用于搜索”。为 Hudsucker 代理 +1。另外,我对这个软件很感兴趣;) 另外,视频做得很好。你应该再添加一些! 很好,我发现我可以在 heroku 中免费使用 elasticsearch,而不是使用像 solr 这样需要花钱的东西...... ElasticSearch 在没有数据的情况下全新安装后在 64 位 Ubuntu 上使用 230MB 的大内存。我真的希望 Elasticsearch 可以在 PostgreSQL 或 Redis 等较小的 VPS 上运行。 @Xeoncross 你是如何让它工作的?我有 1gb ram VPS,我总是遇到无法分配内存错误..【参考方案2】:

我使用过 Sphinx、Solr 和 Elasticsearch。 Solr/Elasticsearch 建立在 Lucene 之上。它添加了许多常用功能:Web 服务器 API、分面、缓存等。

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

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

一些示例用法:

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

【讨论】:

【参考方案3】:

我们经常使用 Lucene 来索引和 搜索数以千万计的文档。 搜索足够快,我们使用 不需要的增量更新 很长时间。我们确实花了一些时间 到达这里。的强项 Lucene 是它的可扩展性,一个大 一系列的功能和一个活跃的 开发者社区。使用裸机 Lucene 需要使用 Java 编程。

如果您重新开始,Lucene 家族中适合您的工具是Solr,它比裸 Lucene 更容易设置,并且几乎拥有 Lucene 的所有功能。它可以轻松导入数据库文档。 Solr 是用 Java 编写的,因此对 Solr 的任何修改都需要 Java 知识,但是您可以通过调整配置文件来做很多事情。

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

IMO,你应该根据:

所需的功能 - 例如你需要一个法语词干分析器吗? Lucene 和 Solr 有一个,其他的我不知道。 精通实现语言 - 如果您不懂 Java,请不要接触 Java Lucene。您可能需要 C++ 来处理 Sphinx。 Lucene 也被移植到otherlanguages。如果您想扩展搜索引擎,这一点非常重要。 易于实验 - 我相信 Solr 在这方面是最好的。 与其他软件的接口 - Sphinx 与 MySQL 有良好的接口。 Solr 支持 ruby​​、XML 和 JSON 接口作为 RESTful 服务器。 Lucene 只允许您通过 Java 进行编程访问。 Compass 和 Hibernate Search 是 Lucene 的包装器,可将其集成到更大的框架中。

【讨论】:

您提出了一个重要概念,即搜索引擎必须具有适应性。 我从未使用过 Xapian。它看起来像一个很好的搜索库,其功能与 Lucene 的不相上下。同样,最重要的是您的应用程序需求、您希望搜索引擎运行的环境、您对实现语言的熟练程度(Xapian 搜索中的 C++,与许多其他语言的绑定)以及引擎的可定制性。 【参考方案4】:

我们在一个带有 10.000.000 + 条 MySql 记录和 10 多个不同数据库的垂直搜索项目中使用 Sphinx。 它对 MySQL 有非常出色的支持,并且在索引方面具有很高的性能,研究速度很快,但可能比 Lucene 略逊一筹。 但是,如果您需要每天快速建立索引并使用 MySQL 数据库,那么它是正确的选择。

【讨论】:

【参考方案5】:

compare ElasticSearch and Solr的实验

【讨论】:

【参考方案6】:

我的 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)

【讨论】:

你试过 sphinx 或 elasticsearch 吗? @dzen 这是狮身人面像;他使用 mysql 查询作为查询执行速度的比较。【参考方案7】:

到目前为止,我能找到的唯一 elasticsearch 与 solr 性能比较如下:

Solr vs elasticsearch Deathmatch!

【讨论】:

那很糟糕。他没有提供cmets!看到这个讨论:groups.google.com/a/elasticsearch.com/group/users/browse_thread/… -1 因为“我的您的评论正在等待审核。”和其他人也看到上面的谷歌组链接 -1 ,一年多后,该线程不允许使用cmet,我会认真考虑完全忽略它。【参考方案8】:

Lucene 很不错,但是它们的停用词集很糟糕。我不得不手动向 StopAnalyzer.ENGLISH_STOP_WORDS_SET 添加大量停用词,以使其接近可用。

我没有使用过 Sphinx,但我知道人们对它的速度和近乎神奇的“易于设置与令人敬畏”的比率发誓。

【讨论】:

【参考方案9】:

试试 indextank。

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

【讨论】:

使用 solr 也可以在运行时进行 tweek 评分 现在没有索引罐了 LinkdenIn 开源 IndexTank,github.com/linkedin/indextank-engine

以上是关于ElasticSearch、Sphinx、Lucene、Solr、Xapian。哪个适合哪个用途? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch、Sphinx、Lucene、Solr、Xapian。哪个适合哪个用途? [关闭]

全文检索:sphinx elasticsearch xunsearch 比较

Elasticsearch 笔记 | 入门概念

ElasticSearch基础入门篇

小烨收藏ElasticSearch概要介绍

Elasticsearch调优篇 01 - Elasticsearch 倒排索引这一篇足够了