NoSQL数据库中的全文搜索

24
  • 这里有没有人有在任何NoSQL数据库中部署完整文本搜索的实际在线系统经验?
  • 例如,在MongoDB、Riak和CouchDB中,全文搜索如何比较?
  • 我正在寻找一些指标,例如易于部署和维护以及速度。
  • 它们有多成熟?它们可以替代Lucene基础设施吗?

4
RavenDB默认使用Lucene。在这里查看http://ravendb.net/faq/lucene-queries-examples。这意味着内置全文搜索。我过去使用过它,但对我来说似乎“尚未达到生产就绪状态”。 - Andrew Orsich
1
MarkLogic是一个基于实时全文搜索的NoSQL数据库。请参见http://developer.marklogic.com/products/marklogic-server/which-nosql - Eric Bloch
1
MarkLogic的产品的开源版本ExistDB拥有出色的全文实现,一旦设置好,我发现它非常容易使用。您可以在此处找到它:http://www.exist-db.org/exist/apps/homepage/index.html - NickChase
请参见此链接,http://stackoverflow.com/questions/13174627/searching-text-from-db-sql-server/22854200#22854200 - NoNaMe
Dgraph声称支持全文搜索: https://dgraph.io/tour/search/5/ - VasiliNovikov
10个回答

10

目前不存在任何一种“NoSQL”数据库能够提供一个合理的 “全文搜索” 实现。MongoDB特别缺乏这方面的功能(使用正则表达式匹配不算是全文搜索,使用$in或$all操作符在关键字列表上进行搜索只是一种非常差的“全文搜索”实现)。使用 Solr、ElasticSearch 或 Sphinx 是比较直接的 - 在应用程序级别进行实现和集成。您的选择很大程度上取决于您的需求和当前设置。


1
Lucene/Solr比使用$in要快得多。 - Chris Fulstow
5
Riak拥有Riak-Search(见下文),它是该产品不可或缺的一部分,据我所知提供了Lucene的良好实现。我们测试过并计划在一个非常大的web应用中将其用于生产环境。 - Elad
@Eland:你能否与我们分享一下你的测试结果以及为什么选择使用Riak?非常感谢。 - unj2
4
我不得不表示不同意。RavenDB拥有出色的全文搜索功能。 - Steve Dunn
1
谁说Solr不是NoSQL的?超强的性能,完美的API和非常好的存储模型,具备控制存储和索引选项的能力。提供了分词器、聚合、高亮等功能。此外,它还是开源的Java工具。我从未使用过比它更好的全文搜索工具。 - OSP
显示剩余2条评论

8
是的。请参考CouchDB-Lucene,它是CouchDB的扩展程序,支持对数据进行完整的Lucene查询。

5
我参与开发一个应用程序,使用基于Cassandra的Apache Solr-Solandra。在我的经验中,这个系统非常稳定,并且能够处理TB+数据。我对该软件感到满意,原因如下: 1.由于Cassandra后端进行自动分区数据。 2.拥有强大的查询功能(由于Solr和Lucene)。 3.快速读写(写入比读取显着更快)。
然而,目前我认为Solandra不支持批量突变。也就是说,我可以将100列插入单个插入到Cassandra中,但是Solandra不支持这个功能。

4
对于MongoDB,目前还没有完整的全文索引功能,但是可能会在2.2版本中推出(参见此处)
同时,您可以通过使用字符串数组字段并为其创建索引来创建一个简单的倒排索引,具体描述请参见Mongo中的全文搜索
或者,您可以在专用的Solr或Lucene索引中维护一个平行的全文索引,并且如果您感觉非常有雄心壮志,也可以直接从Mongo oplog复制到您的全文存储中。否则,请从应用程序逻辑中填充两者并保持同步。

自2.4版本以来,MongoDB拥有text索引 - Walter Tross

2

我刚刚完成了使用存储在MongoDB中的数据以及将全文搜索引擎放在Sphinx Search中。我知道Mongo将来的版本可能会添加全文检索功能,但目前它们还没有实现。

有几种方法可以将Mongo信息插入到Sphinx中,但我发现最好用的一种(而且非常简单)是通过xmlpipe2。我花了一些时间才完全理解如何使用它,但这篇文章: PHP 中的 Sphinx xmlpipe2 提供了一个出色的教程,展示了如何构建文档,然后如何将其插入到 Sphinx 中(至少在 PHP 中)。

我的配置最终看起来像这样:

source my_source {
     type = xmlpipe
     xmlpipe_command = /usr/bin/php /www/generateSphinXml.php identifierForMyTable
}

使用我的索引,现在看起来像这样:

index my_index {
     source = my_source
     path = /usr/local/sphinx/var/data/my_index
     docinfo = extern
     min_word_len = 1
     mlock = 0
     morphology = stem_en
     charset_type = utf-8 //<----- This is q requirement however.
     enable_star = 1
     html_strip = 0
     min_prefix_len = 2
}

我在这方面取得了极大的成功,希望你也能从中受益。

2

1

1

0
cLunce项目。另外,上面没有提到xapian。我使用Sphinx,它非常好,但设置有些笨拙。实际上,我更喜欢通过XMLPIPE2将数据从Mongo传输到Sphinx,而不是使用Sphinx的SQL在sphinx.conf文件中。

0

毫无疑问就是Solr。它是NoSQL。

它有:

  • 惊人的性能
  • 惊人的存储选项
  • 词干器
  • 高亮显示
  • facet
  • 分布式搜索(SolrCloud)
  • 完美的API
  • Web管理
  • HTML、PDF和DOC索引
  • 许多其他功能

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接