全文搜索引擎的比较-Lucene,Sphinx,PostgreSQL,MySQL?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (8)
  • 关注 (0)
  • 查看 (317)

我正在开发一个Django网站,关于搜索引擎我有以下选择:

  • Lucene/Lucene with Compass/Solr
  • Sphinx
  • PostgreSQL
  • MySQL

选择标准:

  • 通过结果相关性排序
  • 检索速度
  • 易于使用,易于与Django集成
  • 资源需求:站点将托管在VPS,因此理想情况下,搜索引擎不需要大量的RAM和CPU。
  • 可伸缩性
  • 额外的功能,相关搜索

有什么好的建议?

注:对于用户实时输入的数据,希望延迟不超过15-30分钟

提问于
用户回答回答于

关于Sphinx。

  • 可以自定义排序方式
  • 索引速度非常快,因为它直接与数据库进行数据交互。
  • 有一个Python的API可以与Sphinx直接使用
  • 搜索服务的守护进程(Searchd)的内存使用量非常低,你也可以设置这个内存使用量
  • 我对它的可伸缩性不是很了解。,它在高负载下非常好,所以在多台机器上扩展应该也是非常方便的。
  • Sphinx在使用字典的时候会使用词干,例如,在搜索时,“driving”和“drive”会被认为是相同的。
  • 但是Sphinx不允许对字段数据进行部分索引更新。

我还不是很清楚MySQL的全文搜索,与其他的性能差异。

用户回答回答于

您可以使用基本的标准,或者发明自己的接口来获得最大的搜索质量。它还可以直接从数据库获取数据。

你可以编译和安装它,或者在独立的服务器上,甚至在主服务器上,它不需要像Solr那样多的重新源,因为它是用C编写的,甚至在小型服务器上运行也很完美。

用户回答回答于

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

MySQL全文最小字长是可调的。

也就是说,MySQL全文有其局限性:数据量越大,速度越慢

用户回答回答于

弹性搜索是基于Lucene的搜索服务器。它提供了一个分布式的、具有多用户功能的全文搜索引擎,具有一个RESTful的web界面和无模式的JSON文档。弹性搜索是在Java中开发的,在Apache许可的条件下作为开放源码发布。

与其他FTS(全文搜索)引擎相比,它的优势是:

  • RESTful接口
  • 不错的可拓展性
  • 大型社区
  • 由Lucene开发人员建造
  • 广泛文献
  • 有很多开放源码库(包括Django)
用户回答回答于

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

但它没有像+或(使用& | !)这样的用户友好的搜索操作,而且我也不喜欢它在他们的文档网站上的工作方式。虽然它在结果片段中添加了匹配项,但是匹配项的默认算法并不好。另外,如果你想索引rtf, PDF, MS Office,则需要文件格式转换器。

它比MySQL文本搜索要好得多,它甚至不包括三个字母或更少的单词。

Lucene/Solr和Sphinx都很棒。

对于Shaili-Solr来说,它包括Lucene搜索代码库,并且拥有一个不错的独立搜索引擎的组件。

用户回答回答于

Apache Solr

我简单的介绍Apache Solr。

Solr 不能用于实时系统,但是对于搜索引擎来说,它是非常棒的

适用于高流量网页-应用程序。它使用RAM,而不是CPU。

  • 结果相关性和排序

boost将会把结果进行排序。比如说,你想找一个名为约翰的人,boost则会帮你进行排序,如下http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

如你所见,首名字段的boosted评分是2。

  • 检索和索引速度

Solr的速度非常快

Solr也能处理多表。只需要提高RAM就能轻松解决。RAM更高,Solr的速度越快。

易于使用,Solr可以很方便的结合Django,你可以通过Haystack实现

  • 需求:站点将在VPS上托管,所以理想情况下,搜索引擎不需要大量的RAM和CPU。

Solr在RAM上运行,如果RAM很高,你就不用担心

  • 可伸缩性

Solr是高度可伸缩的。有以下特性

  • 切分
  • 负载平衡
  • 分布式搜索
  • 高可用性
  • 额外的功能,如“您的意思是?”,相关的搜索等。

对于上面的场景,您可以使用包含Solr的拼写检查组件。

假设您是在Linux环境下,您可以继续。(我的是Ubuntu 14.04版)

详细安装

开始

下载Apache Solr

下载后,将其解压缩到您选择的文件夹中。进入目录

shankar@shankar-lenovo: cd Downloads/solr-4.8.1

启动Jetty应用程序服务器

Jetty是 solr-4.8.1的一个实例。因此你可以这样启动

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar

最小化终端,让他运行

检查Solr是否成功运行,访问http://localhost:8983/Solr

在自定义端口上运行Jetty

它默认运行在端口8983上。您可以运行下面语句或直接在jetty.xml进行设置

java -Djetty.port=9091 -jar start.jar

下载JConnector

这个JAR文件充当了连接MySQL和JDBC

下载后,解压缩文件夹并复制mysql-connector-java-5.1.31-bin.jar并将其粘贴到Lib目录。

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

创建要链接到ApacheSolr的MySQL表

Solr要使用的话,您需要搜索一些表和数据。为此,我们将使用MySQL创建一个表并推送一些随机名称,然后我们可以使用Solr连接到MySQL索引那个表和它的条目。

1.表结构

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

2.把上表

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');

进入内核并添加lib指令

1.Navigate to

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.修改solrconfig.xml

将这两个指令添加到此文件中。

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

现在添加DIH(数据导入处理程序)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

3.创建db-data-config.xml文件

如果文件存在,则忽略,将这些行添加到该文件中。您可以看到第一行,您需要提供MySQL数据库的凭据。数据库名称、用户名和密码。

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

( 提示:你可以拥有任意数量的实体,但是要注意id字段,如果它们是相同的,那么索引将被跳过。)

4.修改 schema.xml 文件

添加下面内容到schema.xml文件中.

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

实施

索引

这才是真正的交易。您需要对MySQL索尔以便使用Solr查询。

步骤1:转到Solr管理小组

打开 URL http://localhost:8983/Solr在你的浏览器上。

步骤二:检查日志

你会发现有很多黄色的警告

没有错误。可以继续

步骤3:dih(数据导入处理程序)

使用DIH,您将连接到MySQLSolr通过配置文件db-data-config.xml配置Solr的接口,并从索引到的数据库中检索这10条记录。

或者,您可以使用直接完全导入这样的查询也是..。

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

在你点击之后执行,,,Solr开始索引记录,如果有错误,它会说索引失败

如果索引成功完成,您将得到此通知。

步骤4:运行Solr查询

现在你可以用Solr查询已索引的数据。单击查询在左边,然后按执行

如图所示,您将看到索引记录。

对应Solr列出所有记录的查询是

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

所有10个索引记录都有。比如说,我们只需要名字Ja,在这种情况下,需要将列名作为目标。solr_name,因此,你的查询应该是这样的

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true
用户回答回答于

Solr与Sphinx非常相似,但有更高级的特性(我还没有使用Sphinx,只是阅读了它)。

Solr还提供了以下附加功能:

  1. 支持复制
  2. 多核
  3. 布尔搜索
  4. 关键词高亮
  5. 可以通过xml或分隔文件更新索引
  6. 支持http通信协议(它甚至可以返回JSON,原生PHP/Ruby/Python)
  7. PDF,Word文档索引
  8. 动态字段
  9. 集合
  10. 截至单词、同义词等。
  11. 更像是这样。
  12. 使用自定义查询直接从数据库中索引
  13. 自动建议
  14. 高速缓存自检
  15. 快速索引
  16. 增加特定的关键字或短语的相关性等规则
  17. 实时搜索

还有很多特性;但是,我只列出了我在生产中实际使用的特性。顺便说一句,MySQL支持上面列表中的#1、#3和#11(有限制)。

Solr的另一个好处是一个文档数据库(例如NoSQL),所以任何其他文档数据库的好处都可以通过Solr实现。

用户回答回答于

我认为Lucene的性能是无与伦比的。只要正确地设置了Lucene索引,就可以在不到10毫秒的时间内进行任何搜索。

不过,最大的缺陷是:将Lucene集成到项目中比较困难。

至于CPU和RAM的需求,在Lucene中进行搜索并不会对CPU造成太大的影响。

简而言之,如果你有大量的数据要进行搜索,你希望有一个较好的性能,我认为Lucene是最好的选择。如果数据不多,那么你最好还是使用MySQL全文搜索。

扫码关注云+社区

领取腾讯云代金券