【问题标题】:MongoDB. [Key Too Large To Index]MongoDB。 [键太大而无法索引]
【发布时间】:2011-09-16 02:26:19
【问题描述】:

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

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

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

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

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

因此它已索引了 10% 的数据,现在返回这 10% 的结果!!

我的选择是什么??

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

【问题讨论】:

    标签: mongodb indexing full-text-search


    【解决方案1】:

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

    sudo mongod --setParameter failIndexKeyTooLong=false
    

    然后再试一次。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        既然你可以做一些阐述,你可以提取一些关键词并将它们放在一个字段中:

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

        并为此建立索引。

        【讨论】:

        • 很有趣,这意味着我可以使用 lucene 之类的东西将文本分解为关键字并将它们放入数组字段并索引该字段?
        • 是的,但是如果把 all 单词放在数组字段中,你将面临同样的问题
        【解决方案4】:

        不要使用 mongo 进行全文搜索

        它不是为此而设计的。是的,很明显你会得到一个错误key too large on indexing for long string values。

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

        【讨论】:

          【解决方案5】:

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

          1. 由于 OP 声称希望进行全文搜索,因此正确的方法是使用直接支持该用例的 text index
          2. 对于长字符串值的精确匹配索引,您可以使用hashed index

          【讨论】:

            猜你喜欢
            • 2015-03-03
            • 1970-01-01
            • 2016-09-03
            • 2014-10-09
            • 1970-01-01
            • 1970-01-01
            • 2020-04-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多