全文搜索引擎的比较-Lucene、Sphinx、Postgresql、MySQL?

全文搜索引擎的比较-Lucene、Sphinx、Postgresql、MySQL?,mysql,postgresql,full-text-search,lucene,sphinx,Mysql,Postgresql,Full Text Search,Lucene,Sphinx,我正在建立一个Django网站,我正在寻找一个搜索引擎 一些候选人: Lucene/带指南针的Lucene/Solr 斯芬克斯 Postgresql内置全文搜索 MySQl内置全文搜索 选择标准: 结果相关性和排名 搜索和索引速度 易于使用并易于与Django集成 资源要求-网站将托管在一个服务器上,因此理想情况下搜索引擎不需要太多的RAM和CPU 可伸缩性 额外的功能,如“你的意思是什么?”,相关搜索等 任何有过以上搜索引擎经验的人,或者列表中没有的其他引擎——我很想听听你的意见 编辑

我正在建立一个Django网站,我正在寻找一个搜索引擎

一些候选人:

  • Lucene/带指南针的Lucene/Solr

  • 斯芬克斯

  • Postgresql内置全文搜索

  • MySQl内置全文搜索

选择标准:

  • 结果相关性和排名
  • 搜索和索引速度
  • 易于使用并易于与Django集成
  • 资源要求-网站将托管在一个服务器上,因此理想情况下搜索引擎不需要太多的RAM和CPU
  • 可伸缩性
  • 额外的功能,如“你的意思是什么?”,相关搜索等
任何有过以上搜索引擎经验的人,或者列表中没有的其他引擎——我很想听听你的意见


编辑:对于索引需求,随着用户不断向站点输入数据,这些数据将需要不断索引。它不必是实时的,但理想情况下,新数据将以不超过15-30分钟的延迟显示在索引中

我不知道Sphinx,但对于Lucene与数据库全文搜索,我认为Lucene的性能是无与伦比的。只要正确设置了Lucene索引,您应该能够在不到10毫秒的时间内完成几乎所有的搜索,无论您要搜索多少条记录

然而,最大的障碍来了:就个人而言,我认为将Lucene集成到您的项目中并不容易。当然,设置它并不难,这样你就可以进行一些基本的搜索,但是如果你想最大限度地利用它,以获得最佳性能,那么你肯定需要一本关于Lucene的好书

至于CPU和RAM的需求,在Lucene中执行搜索不会给CPU带来太多的任务,尽管索引数据是一个问题,尽管您不会经常这样做(可能一天一次或两次),所以这并不是一个很大的障碍


它并不能回答你所有的问题,但简言之,如果你有很多数据要搜索,并且你想要很好的性能,那么我认为Lucene绝对是一个不错的选择。如果您没有那么多数据要搜索,那么您不妨进行数据库全文搜索。在我的书中,设置MySQL全文搜索肯定更容易。

很高兴看到有人插话谈论Lucene,因为我对此一无所知

斯芬克斯,另一方面,我很清楚,让我们看看我是否能帮上忙

  • 结果相关性排名是默认值。您可以根据需要设置自己的排序,并为特定字段赋予更高的权重
  • 索引速度非常快,因为它直接与数据库对话。任何缓慢都将来自复杂的SQL查询和未索引的外键以及其他类似问题。我也从来没有注意到任何搜索的缓慢
  • 我是Rails的人,所以我不知道用Django实现有多容易。不过Sphinx源代码附带了一个Python API
  • 搜索服务守护进程(searchd)的内存使用率非常低,您也可以设置索引器进程使用的限制
  • 我对可伸缩性的了解比较粗略,但将索引文件复制到多台机器并运行多个searchd守护进程非常简单。不过,我从其他人那里得到的总体印象是,它在高负载下非常好,因此跨多台机器扩展它并不需要处理
  • 没有对“你的意思是什么”等的支持——尽管这些可以用其他工具轻松完成。斯芬克斯虽然使用字典,但也有词干,所以“driving”和“drive”(例如)在搜索中被认为是相同的
  • Sphinx不允许对字段数据进行部分索引更新。常用的方法是维护一个包含所有最近更改的增量索引,并在每次更改后重新索引(这些新结果在一两秒钟内出现)。由于数据量较小,这可能需要几秒钟的时间。不过,您仍然需要定期重新索引主数据集(尽管是否定期取决于数据的波动性-每天?每小时?)。快速的索引速度使这一切都非常轻松
我不知道这对您的情况有多适用,但是(Sphinx、Ferret(Ruby的Lucene端口)和Solr)运行了一些基准测试。我想可能有用


我还没有深入研究过MySQL的全文搜索,但我知道它在速度和功能方面都无法与Sphinx、Lucene或Solr竞争。

我现在正在研究PostgreSQL全文搜索,它拥有现代搜索引擎的所有正确功能,非常好的扩展字符和多语言支持,与数据库中的文本字段紧密集成

但是它没有像+或和(使用&|!)这样的用户友好的搜索操作符,我对它在他们的文档站点上的工作方式也不满意。虽然它在结果片段中有粗体的匹配项,但匹配项的默认算法并不理想。此外,如果你想索引rtf、PDF、MS Office,你必须找到并集成一个文件格式转换器


OTOH,它比MySQL文本搜索要好得多,MySQL文本搜索甚至不索引三个字母或更少的单词。这是MediaWiki搜索的默认设置,我真的认为这对最终用户没有好处:

在我见过的所有案例中,Lucene/Solr和Sphinx都非常出色。它们是可靠的代码,并且随着可用性的显著改进而不断发展,因此所有的工具都可以让搜索满足几乎所有人的需求

对于SHAILI-SOLR,它包括Lucene搜索代码库,并具有成为一个优秀的独立搜索引擎的组件。

SearchTools Avi说“MySQL文本搜索,它甚至不索引三个字母或更少的单词。”

FYIs,MySQL全文最小字长是可调的,因为至少MySQL 5.0。
http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john
CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf
  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />
<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>
<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>
<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />
http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true
http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true
http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true