全文搜索引擎的比较- Lucene,Sphinx,Postgresql,MySQL?[已关闭]

izj3ouym  于 2022-11-07  发布在  Lucene
关注(0)|答案(9)|浏览(206)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
8个月前关门了。
机构群体在8个月前审核了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我正在建立一个Django网站,我正在寻找一个搜索引擎。
几个候选人:

  • Lucene/带指南针的Lucene/Solr
  • 狮身人面像
  • Postgresql内置全文搜索
  • MySQl内置全文搜索

选择标准:

  • 结果相关性和排序
  • 搜索和索引速度
  • 易于使用,易于与Django集成
  • 资源要求-网站将托管在VPS上,因此理想情况下,搜索引擎不需要大量的RAM和CPU
  • 可量测性
  • 诸如“你是说?"、相关搜索等的额外特征

任何人谁有经验的搜索引擎以上,或其他引擎不在名单上-我很乐意听到你的意见。
编辑:至于索引需求,由于用户不断地向网站输入数据,这些数据需要不断地被索引。它不一定是真实的的,但理想的情况是,新数据将出现在索引中,延迟不超过15 - 30分钟

7ajki6be

7ajki6be1#

很高兴看到有人插话说Lucene --因为我对这一点一无所知。
斯芬克斯,另一方面,我很了解,所以让我们看看我能不能帮上忙。

  • 结果相关性等级是默认值。如果需要,您可以设置自己的排序,并为特定字段赋予更高的权重。
  • 索引速度超快,因为它直接与数据库对话。任何缓慢都将来自复杂的SQL查询和未索引的外键等问题。我也从来没有注意到任何搜索缓慢。
  • 我是一个Rails爱好者,所以我不知道用Django实现它有多容易。不过有一个Python API附带了Sphinx源代码。
  • 搜索服务守护进程(searchd)的内存使用率非常低--您也可以设置索引器进程使用的内存量限制。
  • 可伸缩性是我的知识比较粗略的地方--但是把索引文件复制到多台机器上并运行几个searchd守护进程是很容易的。不过我从其他人那里得到的总体印象是,它在高负载下非常好,所以在多台机器上扩展它并不是需要处理的事情。
  • 它不支持“did-you-mean”等--尽管这些可以用其他工具很容易地完成。Sphinx使用字典来词干化单词,所以“driving”和“drive”(例如)在搜索中会被认为是相同的。
  • 但是Sphinx不允许对字段数据进行部分索引更新。(并且那些新的结果在一两秒内出现)。由于数据量很小,这可能需要几秒钟的时间。不过,您仍然需要定期对主数据集重新建立索引(尽管多久一次取决于数据的波动性--每天?每小时?)快速的索引速度让这一切都变得相当轻松。

我不知道这对你的情况有多大的适用性,但是Evan Weaver compared a few of the common Rails search options(Sphinx,Ferret(Lucene的Ruby移植)和Solr),运行一些基准测试。我想可能会有用。
我还没有深入研究MySQL的全文搜索,但我知道它在速度和功能方面都无法与Sphinx、Lucene或Solr竞争。

2o7dmzc5

2o7dmzc52#

我不知道Sphinx,但是关于Lucene与数据库全文搜索的比较,我认为Lucene的性能是无与伦比的。只要正确设置了Lucene索引,你应该能够在10毫秒内完成几乎 * 任何 * 搜索,无论你要搜索多少条记录。
然而,最大的障碍来了:我个人认为,在你的项目中集成Lucene并不容易。2当然,设置它并不太难,这样你就可以做一些基本的搜索,但是如果你想最大限度地利用它,获得最佳的性能,那么你肯定需要一本关于Lucene的好书。
至于CPU和RAM需求,在Lucene中执行搜索不会给CPU带来太多的负担,尽管索引数据是如此,尽管您不经常这样做(可能一天一两次),所以这不是一个很大的障碍。
它并不能回答你所有的问题,但是简而言之,如果你有大量的数据要搜索,并且你想要很好的性能,那么我认为Lucene绝对是你的选择。如果你没有那么多的数据要搜索,那么你还不如去数据库全文搜索。在我的书中,设置MySQL全文搜索绝对更容易。

zf2sa74q

zf2sa74q3#

Apache Solr的名字

除了回答OP的问题之外,让我从简单的介绍详细的安装实现对***Apache Solr***提出一些见解。

简单介绍

  • 任何人谁有经验的搜索引擎以上,或其他引擎不在名单上-我很乐意听到你的意见。*
    Solr不应该用来解决实时问题。对于搜索引擎来说,Solr几乎是游戏,工作起来 * 完美无缺
    Solr在高流量Web应用程序上运行良好(
    我在某个地方读到它不适合此应用程序,但我正在备份该语句 *)。它利用RAM,而不是CPU。
  • 结果相关性和排序
    boost可以帮助你将搜索结果排在最前面。比如,你想在 firstnamelastname 字段中搜索一个名字 john,并且你想给 firstname 字段给予相关性,那么你需要boost向上排列 firstname 字段,如图所示。
http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

如您所见,firstname 字段提升为2分。
有关SolrRelevancy的更多信息

  • 搜索和索引速度

速度快得令人难以置信,而且毫不妥协。我搬到Solr的原因。
关于索引速度,Solr还可以处理来自数据库表的JOIN。更高和更复杂的JOIN确实会影响索引速度。但是,巨大的RAM配置可以轻松解决这种情况。
内存越大,Solr的索引速度越快。

  • 易于使用,易于与Django集成

从来没有尝试过集成SolrDjango,但是你可以用Haystack来实现。我在上面发现了一些有趣的article,下面是它的github

  • 资源要求-网站将托管在一个VPS上,所以理想情况下搜索引擎不会需要大量的RAM和CPU
    Solr在RAM上繁殖,因此如果RAM很高,则不必担心Solr
    Solr的RAM使用量在全索引时急剧增加如果你有几十亿条记录,你可以聪明地使用Delta导入来解决这种情况。正如所解释的,Solr*只是一个接近实时的解决方案 *。
  • 可量测性
    Solr是高度可扩展的。看看SolrCloud。它的一些关键特性。
  • 分片(或者分片是在多台机器之间分发索引的概念,比如说,如果您的索引变得太大)
  • 负载平衡(如果Solrj与Solr云一起使用,它会使用其循环机制自动处理负载平衡)
  • Distributed Search
  • 高可用性
  • 诸如“你是说?"、相关搜索等的额外特征

对于上面的场景,你可以使用与Solr打包的SpellCheckComponent。还有很多其他的特性,SnowballPorterFilterFactory帮助检索记录,比如说如果你键入 books 而不是 book,你将看到与 book 相关的结果。
这个答案主要针对Apache Solr&MySQL。Django不在范围内。
假设您是在LINUX环境下,您可以继续阅读本文(我的是Ubuntu 14.04版本)。

详细安装

入门

here下载Apache Solr。它的版本是4.8.1。您可以下载新版本,我发现这个版本很稳定。
下载存档后,将其解压到您选择的文件夹中。例如.. Downloads或其他文件夹..因此,它看起来将像Downloads/solr-4.8.1/
根据提示..在目录中导航
shankar@shankar-lenovo: cd Downloads/solr-4.8.1
所以你现在在这里..
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$

启动Jetty应用程序服务器

Jetty位于solr-4.8.1目录的examples文件夹中,因此请在该文件夹中导航并启动Jetty Application Server。

shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar
现在,不要关闭终端,将其最小化并放在一边。
(提示:在start.jar之后使用&可使Jetty服务器在后台运行)
要检查Apache Solr是否成功运行,请在浏览器上访问此URL。http://localhost:8983/solr

在自定义端口上运行Jetty

默认情况下它运行在端口8983上。你可以在这里或者直接在jetty.xml文件中更改端口。
java -Djetty.port=9091 -jar start.jar

下载JConnector

此JAR文件充当MySQL和JDBC之间的桥梁,下载平台独立版本here
下载后,解压缩文件夹并复制mysql-connector-java-5.1.31-bin.jar,然后将其粘贴到lib目录。
shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib

创建要链接到Apache Solr的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.导航至

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

实施

索引

这才是真实的的交易所在。为了使用Solr Queries,您需要将数据从MySQL索引到Solr

步骤1:转到Solr管理面板

点击浏览器上的URL http://localhost:8983/solr。屏幕如下所示。

如标记所示,转到日志记录,以检查上述配置是否导致错误。

步骤2:检查日志

好的,现在你在这里,因为你可以有很多黄色的消息(警告)。确保你没有红色标记的错误消息。之前,在我们的配置中,我们在我们的db-data-config.xml上添加了一个选择查询,假设在这个查询中有任何错误,它会在这里显示。

很好,没有错误。我们可以开始了。让我们从所示列表中选择collection 1,然后选择Dataimport

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

使用DIH,您将通过Solr接口的配置文件db-data-config.xmlSolr连接到MySQL,并从索引到Solr的数据库中检索10条记录。
要执行此操作,请选择full-import,并选中选项 CleanCommit。现在单击Execute,如图所示。
或者,您也可以使用直接的full-import查询,如下所示。

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

单击Execute后,Solr将开始索引记录,如果出现任何错误,它将显示Indexing Failed,您必须返回到Logging部分以查看出现了什么错误。
假设此配置没有错误,并且索引成功完成,则您将收到此通知。

步骤4:运行Solr查询

看起来一切都很顺利,现在您可以使用SolrQueries来查询已索引的数据。单击左侧的Query,然后按底部的Execute按钮。
您将看到如下所示的索引记录。
列出所有记录的相应Solr查询是

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

x1c4d 1x指令集
假设我们只需要以Ja开头的名称,在本例中,您需要将列名solr_name作为目标,因此您的查询如下所示。

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

这就是您编写Solr查询的方法。要了解更多信息,请查看这个漂亮的article

carvr3hs

carvr3hs4#

我很惊讶没有更多关于Solr的信息发布。Solr与Sphinx非常相似,但有更高级的功能(AFAIK,因为我没有使用过Sphinx --只是读过它)。
下面的链接中的答案详细介绍了一些关于Sphinx的事情,这也适用于Solr。全文搜索引擎的比较- Lucene,Sphinx,Postgresql,MySQL?
Solr还提供以下附加功能:
1.支持复制
1.多个核心(可将其视为具有自己的配置和索引的独立数据库)
1.布尔搜索
1.突出显示关键字(如果有regex-fu,在应用程序代码中很容易做到;但是,为什么不让一个专门的工具为您做得更好呢)
1.通过XML或分隔文件更新索引
1.通过HTTP与搜索服务器通信(它甚至可以返回Json、原生PHP/Ruby/Python)

  1. PDF、Word文档索引
    1.动态字段
    1.刻面
    1.聚合字段
    1.停用词、同义词等。
    1.更多类似内容...
    1.使用自定义查询直接从数据库编制索引
    1.自动建议
    1.缓存自动预热
    1.快速索引(与MySQL全文搜索索引时间相比)-- Lucene使用二进制倒排索引格式。
    1.增强(用于增加特定关键字或短语等的相关性的自定义规则)
    1.字段搜索(如果搜索用户知道他/她要搜索的字段,他们可以通过键入字段,然后键入值来缩小搜索范围,并且只搜索该字段,而不是搜索所有字段--用户体验更好)
    顺便说一句,有吨更多的功能;然而,我只列出了我在生产中实际使用过的特性。顺便说一句,MySQL支持上面列表中的#1、#3和#11(有限)。对于您正在寻找的特性,关系数据库是无法满足的。我会直接删除这些特性。
    另外,Solr(实际上是Lucene)的另一个好处是它是一个文档数据库(例如NoSQL),因此任何其他文档数据库的许多好处都可以通过Solr实现。换句话说,您可以将它用于搜索以外的用途(即性能)。使用它来发挥创造性:)
rsl1atfo

rsl1atfo5#

我现在正在研究PostgreSQL全文搜索,它具有现代搜索引擎的所有正确功能,非常好的扩展字符和多语言支持,与数据库中的文本字段紧密集成。
但它没有用户友好的搜索操作符,如+或AND(使用&|!),我对它在他们的文档网站上的工作方式并不满意。虽然它在结果片段中加粗了匹配项,但匹配项的默认算法并不好。另外,如果你想索引rtf、PDF、MS Office,你必须找到并集成一个文件格式转换器。
OTOH,它比MySQL文本搜索好得多,MySQL文本搜索甚至不索引三个字母或更少的单词。它是MediaWiki搜索的默认设置,我真的认为它对最终用户没有好处:http://www.searchtools.com/analysis/mediawiki-search/

在我所看到的所有案例中,Lucene/Solr和Sphinx都非常棒。它们是可靠的代码,并且在可用性方面有了显著的改进,所以这些工具都是为了让几乎所有人都满意的搜索。

SOLR包括Lucene搜索代码库,并具有成为一个不错的独立搜索引擎的组件。

lsmd5eda

lsmd5eda6#

只是我对这个非常古老的问题的两分钱。我强烈推荐看一看ElasticSearch
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式的、支持多租户的全文搜索引擎,具有REST风格的Web界面和无模式的JSON文档。Elasticsearch是用Java开发的,并根据Apache许可证条款作为开源发布。
与其他FTS(全文搜索)引擎相比,它的优势在于:

  • REST风格的界面
  • 更好的可扩展性
  • 大型社区
  • 由Lucene开发人员构建
  • 大量文档
  • 可用的There are many开源库(包括Django)

我们正在使用这个搜索引擎在我们的项目和非常高兴与它

k7fdbhmy

k7fdbhmy7#

SearchTools-Avi说:“MySQL文本搜索,它甚至不索引三个字母或更少的单词。”
仅供参考,MySQL全文最小字长是可调的,因为 * 至少 * MySQL 5.0。谷歌'mysql全文最小长度'的简单说明。
也就是说,MySQL全文具有局限性:首先,一旦你达到一百万条记录左右,它的更新就会变得很慢,...

h9vpoimq

h9vpoimq8#

我们 刚刚 从 Elasticsearch 切换 到 Postgres Full Text 。 因为 我们 已经 使用 了 Postgres , 我们 现在 省去 了 保持 索引 最 新 的 麻烦 。 但 这 只 会 影响 全文 搜索 。 然而 , 在 一些 用例 中 , Elasticsearch 明显 更 好 。 可能 是 面 或 类似 的 东西 。

相关问题