**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。
我们不允许问题寻求书籍、工具、软件库等的建议。您可以编辑问题,以便使用事实和引文来回答。
8个月前关门了。
机构群体在8个月前审核了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我正在建立一个Django网站,我正在寻找一个搜索引擎。
几个候选人:
- Lucene/带指南针的Lucene/Solr
- 狮身人面像
- Postgresql内置全文搜索
- MySQl内置全文搜索
选择标准:
- 结果相关性和排序
- 搜索和索引速度
- 易于使用,易于与Django集成
- 资源要求-网站将托管在VPS上,因此理想情况下,搜索引擎不需要大量的RAM和CPU
- 可量测性
- 诸如“你是说?"、相关搜索等的额外特征
任何人谁有经验的搜索引擎以上,或其他引擎不在名单上-我很乐意听到你的意见。
编辑:至于索引需求,由于用户不断地向网站输入数据,这些数据需要不断地被索引。它不一定是真实的的,但理想的情况是,新数据将出现在索引中,延迟不超过15 - 30分钟
9条答案
按热度按时间7ajki6be1#
很高兴看到有人插话说Lucene --因为我对这一点一无所知。
斯芬克斯,另一方面,我很了解,所以让我们看看我能不能帮上忙。
我不知道这对你的情况有多大的适用性,但是Evan Weaver compared a few of the common Rails search options(Sphinx,Ferret(Lucene的Ruby移植)和Solr),运行一些基准测试。我想可能会有用。
我还没有深入研究MySQL的全文搜索,但我知道它在速度和功能方面都无法与Sphinx、Lucene或Solr竞争。
2o7dmzc52#
我不知道Sphinx,但是关于Lucene与数据库全文搜索的比较,我认为Lucene的性能是无与伦比的。只要正确设置了Lucene索引,你应该能够在10毫秒内完成几乎 * 任何 * 搜索,无论你要搜索多少条记录。
然而,最大的障碍来了:我个人认为,在你的项目中集成Lucene并不容易。2当然,设置它并不太难,这样你就可以做一些基本的搜索,但是如果你想最大限度地利用它,获得最佳的性能,那么你肯定需要一本关于Lucene的好书。
至于CPU和RAM需求,在Lucene中执行搜索不会给CPU带来太多的负担,尽管索引数据是如此,尽管您不经常这样做(可能一天一两次),所以这不是一个很大的障碍。
它并不能回答你所有的问题,但是简而言之,如果你有大量的数据要搜索,并且你想要很好的性能,那么我认为Lucene绝对是你的选择。如果你没有那么多的数据要搜索,那么你还不如去数据库全文搜索。在我的书中,设置MySQL全文搜索绝对更容易。
zf2sa74q3#
Apache Solr的名字
除了回答OP的问题之外,让我从简单的介绍到详细的安装和实现对***Apache Solr***提出一些见解。
简单介绍
Solr不应该用来解决实时问题。对于搜索引擎来说,Solr几乎是游戏,工作起来 * 完美无缺 。
Solr在高流量Web应用程序上运行良好( 我在某个地方读到它不适合此应用程序,但我正在备份该语句 *)。它利用RAM,而不是CPU。
boost可以帮助你将搜索结果排在最前面。比如,你想在 firstname 和 lastname 字段中搜索一个名字 john,并且你想给 firstname 字段给予相关性,那么你需要boost向上排列 firstname 字段,如图所示。
如您所见,firstname 字段提升为2分。
有关SolrRelevancy的更多信息
速度快得令人难以置信,而且毫不妥协。我搬到Solr的原因。
关于索引速度,Solr还可以处理来自数据库表的JOIN。更高和更复杂的JOIN确实会影响索引速度。但是,巨大的RAM配置可以轻松解决这种情况。
内存越大,Solr的索引速度越快。
从来没有尝试过集成Solr和Django,但是你可以用Haystack来实现。我在上面发现了一些有趣的article,下面是它的github。
Solr在RAM上繁殖,因此如果RAM很高,则不必担心Solr。
Solr的RAM使用量在全索引时急剧增加如果你有几十亿条记录,你可以聪明地使用Delta导入来解决这种情况。正如所解释的,Solr*只是一个接近实时的解决方案 *。
Solr是高度可扩展的。看看SolrCloud。它的一些关键特性。
对于上面的场景,你可以使用与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.表格结构
2.填写上表
进入核心并添加lib指令
1.导航至
2.修改solrconfig.xml文件
将这两个指令添加到此文件中。
现在添加DIH(数据导入处理程序)
3.创建db-data-config.xml文件
如果该文件存在,则忽略,将这些行添加到该文件中。正如您可以看到的第一行,您需要提供您的MySQL数据库的凭据。数据库名称、用户名和密码。
(提示:您可以拥有任意数量的实体,但要注意ID字段,如果它们相同,则将跳过索引。)
4.修改schema.xml文件
将其添加到您schema.xml中,如下所示。
实施
索引
这才是真实的的交易所在。为了使用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.xml从Solr连接到MySQL,并从索引到Solr的数据库中检索10条记录。
要执行此操作,请选择full-import,并选中选项 Clean 和 Commit。现在单击Execute,如图所示。
或者,您也可以使用直接的full-import查询,如下所示。
单击Execute后,Solr将开始索引记录,如果出现任何错误,它将显示Indexing Failed,您必须返回到Logging部分以查看出现了什么错误。
假设此配置没有错误,并且索引成功完成,则您将收到此通知。
步骤4:运行Solr查询
看起来一切都很顺利,现在您可以使用SolrQueries来查询已索引的数据。单击左侧的Query,然后按底部的Execute按钮。
您将看到如下所示的索引记录。
列出所有记录的相应Solr查询是
x1c4d 1x指令集
假设我们只需要以Ja开头的名称,在本例中,您需要将列名
solr_name
作为目标,因此您的查询如下所示。这就是您编写Solr查询的方法。要了解更多信息,请查看这个漂亮的article。
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.动态字段
1.刻面
1.聚合字段
1.停用词、同义词等。
1.更多类似内容...
1.使用自定义查询直接从数据库编制索引
1.自动建议
1.缓存自动预热
1.快速索引(与MySQL全文搜索索引时间相比)-- Lucene使用二进制倒排索引格式。
1.增强(用于增加特定关键字或短语等的相关性的自定义规则)
1.字段搜索(如果搜索用户知道他/她要搜索的字段,他们可以通过键入字段,然后键入值来缩小搜索范围,并且只搜索该字段,而不是搜索所有字段--用户体验更好)
顺便说一句,有吨更多的功能;然而,我只列出了我在生产中实际使用过的特性。顺便说一句,MySQL支持上面列表中的#1、#3和#11(有限)。对于您正在寻找的特性,关系数据库是无法满足的。我会直接删除这些特性。
另外,Solr(实际上是Lucene)的另一个好处是它是一个文档数据库(例如NoSQL),因此任何其他文档数据库的许多好处都可以通过Solr实现。换句话说,您可以将它用于搜索以外的用途(即性能)。使用它来发挥创造性:)
rsl1atfo5#
我现在正在研究PostgreSQL全文搜索,它具有现代搜索引擎的所有正确功能,非常好的扩展字符和多语言支持,与数据库中的文本字段紧密集成。
但它没有用户友好的搜索操作符,如+或AND(使用&|!),我对它在他们的文档网站上的工作方式并不满意。虽然它在结果片段中加粗了匹配项,但匹配项的默认算法并不好。另外,如果你想索引rtf、PDF、MS Office,你必须找到并集成一个文件格式转换器。
OTOH,它比MySQL文本搜索好得多,MySQL文本搜索甚至不索引三个字母或更少的单词。它是MediaWiki搜索的默认设置,我真的认为它对最终用户没有好处:http://www.searchtools.com/analysis/mediawiki-search/
在我所看到的所有案例中,Lucene/Solr和Sphinx都非常棒。它们是可靠的代码,并且在可用性方面有了显著的改进,所以这些工具都是为了让几乎所有人都满意的搜索。
SOLR包括Lucene搜索代码库,并具有成为一个不错的独立搜索引擎的组件。
lsmd5eda6#
只是我对这个非常古老的问题的两分钱。我强烈推荐看一看ElasticSearch。
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式的、支持多租户的全文搜索引擎,具有REST风格的Web界面和无模式的JSON文档。Elasticsearch是用Java开发的,并根据Apache许可证条款作为开源发布。
与其他FTS(全文搜索)引擎相比,它的优势在于:
我们正在使用这个搜索引擎在我们的项目和非常高兴与它
k7fdbhmy7#
SearchTools-Avi说:“MySQL文本搜索,它甚至不索引三个字母或更少的单词。”
仅供参考,MySQL全文最小字长是可调的,因为 * 至少 * MySQL 5.0。谷歌'mysql全文最小长度'的简单说明。
也就是说,MySQL全文具有局限性:首先,一旦你达到一百万条记录左右,它的更新就会变得很慢,...
h9vpoimq8#
我们 刚刚 从 Elasticsearch 切换 到 Postgres Full Text 。 因为 我们 已经 使用 了 Postgres , 我们 现在 省去 了 保持 索引 最 新 的 麻烦 。 但 这 只 会 影响 全文 搜索 。 然而 , 在 一些 用例 中 , Elasticsearch 明显 更 好 。 可能 是 面 或 类似 的 东西 。