elasticsearch,sphinx,xapian,Solr,Lucene,elasticsearch,Sphinx,Xapian" /> elasticsearch,sphinx,xapian,Solr,Lucene,elasticsearch,Sphinx,Xapian" />

Solr ElasticSearch、斯芬克斯、卢森、索尔、沙皮安。哪个适合哪个用途?

Solr ElasticSearch、斯芬克斯、卢森、索尔、沙皮安。哪个适合哪个用途?,solr,lucene,elasticsearch,sphinx,xapian,Solr,Lucene,elasticsearch,Sphinx,Xapian,我目前正在研究其他搜索方法,而不是使用大型SQL查询。 我最近看到并玩过(搜索引擎的Python实现) 您能给出选择的理由吗?我们定期使用Lucene索引和 搜索数千万个文档。 搜索速度足够快,我们使用 不采取任何措施的增量更新 很长时间了。这确实花了我们一些时间 来这里。优势 Lucene是它的可扩展性,一个大的 一系列功能和一个活跃的 开发人员社区。使用裸 Lucene需要用Java编程 如果你重新开始,Lucene家族中适合你的工具是,它比bare Lucene更容易设置,并且几乎拥有Lu

我目前正在研究其他搜索方法,而不是使用大型SQL查询。 我最近看到并玩过(搜索引擎的Python实现)


您能给出选择的理由吗?

我们定期使用Lucene索引和 搜索数千万个文档。 搜索速度足够快,我们使用 不采取任何措施的增量更新 很长时间了。这确实花了我们一些时间 来这里。优势 Lucene是它的可扩展性,一个大的 一系列功能和一个活跃的 开发人员社区。使用裸 Lucene需要用Java编程

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

我也听说了Sphinx的好消息,特别是与MySQL数据库的结合。但我没有用过

在国际海事组织,您应根据以下内容进行选择:

  • 所需功能-例如,您是否需要法式词干分析器?Lucene和Solr有一个,其他的我不知道
  • 精通实现语言-如果不懂Java,请不要接触Java Lucene。你可能需要C++来做狮身人面像的事情。Lucene也被移植到了中国。如果您想扩展搜索引擎,这一点非常重要
  • 易于实验-我相信Solr在这方面是最好的
  • 与其他软件的接口——Sphinx与MySQL有很好的接口。Solr支持ruby、XML和JSON接口作为RESTful服务器。Lucene只允许您通过Java进行编程访问。并且是Lucene的包装器,将其集成到更大的框架中
我使用了斯芬克斯、索尔和埃拉斯蒂克搜索。Solr/Elasticsearch构建在Lucene之上。它添加了许多常见功能:web服务器api、刻面、缓存等

如果你只想有一个简单的全文搜索设置,斯芬克斯是一个更好的选择

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

一些示例用法:

  • 斯芬克斯:craigslist.org
  • 解决方案:Cnet、Netflix、digg.com
  • Elasticsearch:Foursquare,Github

Lucene很不错,但他们的停止词集很糟糕。我不得不手动在StopAnalyzer.ENGLISH\u stop\u words\u中添加大量stop单词,以使其接近可用


我没有用过斯芬克斯,但我知道人们对它的速度和近乎神奇的“设置简单到令人惊叹”的比率信誓旦旦。

作为ElasticSearch的创造者,也许我可以给你一些理由来解释我为什么要先创建它:)

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

就Lucene的可用性而言,早在我创建Compass的时候(现在差不多6年了)。其目的是简化Lucene的使用,使日常Lucene变得更简单。我一次又一次遇到的是能够分发指南针的要求。我开始从Compass内部着手,通过与GigaSpaces、Coherence和Terracotta等数据网格解决方案集成,但这还不够

在其核心,分布式Lucene解决方案需要分片。此外,随着HTTP和JSON作为无处不在的API的发展,这意味着可以轻松使用一个解决方案,即使用不同语言的许多不同系统

这就是为什么我继续创建ElasticSearch。它有一个非常高级的分布式模型,本机使用JSON,并公开了许多高级搜索功能,所有这些功能都通过JSON DSL无缝表达

Solr也是一种通过HTTP公开索引/搜索服务器的解决方案,但我认为它提供了一种更优越的分布式模型和易用性(尽管目前缺少一些搜索功能,但不会太久,而且在任何情况下,计划是将所有Compass功能纳入ElasticSearch)。当然,我有偏见,因为我创建了ElasticSearch,所以您可能需要自己检查

至于斯芬克斯,我没有用过,所以我不能评论。我可以向你们介绍的是,我认为它证明了ElasticSearch的优越分布式模型


当然,ElasticSearch不仅仅是分布式的,还有更多的功能。它实际上是在考虑云的情况下构建的。您可以查看网站上的功能列表。

我们在一个垂直搜索项目中使用Sphinx,其中包含10.000.000+个MySql记录和10+个不同的数据库。 它对MySQL有非常好的支持,在索引方面有很高的性能,研究速度很快,但可能比Lucene要慢一点。 但是,如果您每天都需要快速索引并使用MySQL数据库,那么它是正确的选择。

试试indextank


作为弹性搜索的例子,它被认为比lucene/solr更易于使用。它还包括非常灵活的评分系统,可以在不重新编制索引的情况下进行调整。

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

我的狮身人面像的实验

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");
?>
Sphinx查询时间(1k并发):

MySQL查询时间:

=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)
"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)
MySQL查询时间(1k并发):


您提出了一个重要的概念,即搜索引擎必须具有适应性。我从未使用过Xapian。它看起来像是一个很好的搜索库,其特征与Lucene相当。同样,最重要的是您的应用程序需求、您希望搜索引擎运行的环境、您对实现语言(Xapian中的C++)的熟练程度
=> 0.346 sec. (average)
=> 0.340 sec. (average of last 10 query)
"SELECT * FROM hb_posts WHERE id = 123;"
=> 0.001 sec.
"SELECT * FROM my_posts WHERE id = 123;" 
=> 1.612 sec. (average)
=> 1.920 sec. (average of last 10 query)