MongoDB的。 [索引太大而无法索引]

时间:2011-06-16 06:06:15

标签: mongodb indexing full-text-search

一些背景知识:我打算将MongoDB用作我的一些网站的发布前端数据库。实际数据将保存在SQL Server数据库中,并且将有预定时间间隔填充MongoDB的后台作业,以便提高网站性能。

情况:我有一个表'x',我翻译成一个mongo集合,一切正常。

'x'在源数据库中有一个最初为NVARCHAR(MAX)的列'c',并且其中包含多语言文本。

当我按列'c'搜索时,mongo正在对集合进行全扫描。

所以我尝试了一个有效的ensureIndex({c:1}),但当我检查mongodb日志时,它向我显示90%的数据无法索引为[Key Too Large To Index] !!

因此已经将10%的数据编入索引,现在从10%的数据中返回结果!!

我有什么选择?

注意:我正在使用此专栏在SQL Server中进行全文搜索,现在我不确定是否应该继续使用Mongo :(

5 个答案:

答案 0 :(得分:24)

尝试使用此参数运行mongod进程:

sudo mongod --setParameter failIndexKeyTooLong=false

然后再试一次。

答案 1 :(得分:0)

由于您可以进行一些细化,您可以提取一些关键词并将它们放在一个字段中:

   _keywords : [ "mongodb" , "full search" , "nosql" ]

并为此制作索引。

答案 2 :(得分:0)

如果你需要在一个大字符串中搜索文本,你可以使用其中一个:
keyword splitting
regular expression

前者的缺点是你需要一些“逻辑”来组合关键词来进行搜索,后者会严重影响性能。
可能如果你真的需要全文搜索,最好的选择是使用像solr或lucene这样的外部索引器。

答案 3 :(得分:0)

不要使用mongo进行全文搜索

它不是为此而设计的。是的,很明显,对于长字符串值,索引会出现错误键太大。

如果主要关注的是搜索,那么更好的方法是使用全文搜索服务器(solr / lucene或sphinx)。

答案 4 :(得分:0)

最近( 2.4及以上)MongoDB版本提供了其他几个选项:

  1. 由于OP声明要求全文搜索,正确的方法是使用直接支持该用例的text index
  2. 对于长字符串值的完全匹配索引,您可以使用hashed index