Mongodb - 多文本索引 : Index key pattern too large error code 67

标签 mongodb indexing mongodb-query nosql

我有以下 Mongodb 数据库结构:

{ 
    "_id" : "519817e508a16b447c00020e", 
    "keyword" : "Just an example query", 
    "rankings" : 
    {
        results:
        {
            "1" : { "domain" : "example1.com", "href" : "http://www.example1.com/"},
            "2" : { "domain" : "example2.com", "href" : "http://www.example2.com/"},
            "3" : { "domain" : "example3.com", "href" : "http://www.example3.com/"},
            "4" : { "domain" : "example4.com", "href" : "http://www.example4.com/"},
            "5" : { "domain" : "example5.com", "href" : "http://www.example5.com/"},
            ...
            ...
            "99" : { "domain" : "example99.com", "href" : "http://www.example99.com/"}
            "100" : {"domain" : "example100.com", "href" : "http://www.example100.com/"}
        }, 
        "plus":"many", 
        "other":"not", 
        "interesting" : "stuff", 
        "for": "this question"
    }
}

In a previous question ,我问了如何索引文本,以便我可以搜索关键字和域,例如:

db.ranking.find({ $text: { $search: "\"example9.com\" \"Just an example query\""}})  

John Petrone 的精彩回答是:

db.ranking.ensureIndex(
{
    "keyword": "text",
    "rankings.results.1.domain" : "text",
    "rankings.results.2.domain" : "text",
    ...
    ...
    "rankings.results.99.domain" : "text",
    "rankings.results.100.domain" : "text"
}

但是,如果当我有 10 个结果时效果很好,当我尝试为 100 个结果编制索引时,我会遇到来自 Mongo shell 的代码 67 的“索引键模式太大”错误。

所以最大的问题是:

如何(见鬼)解决“索引键模式太大”错误?


编辑:2014 年 8 月 18 日 文件结构清晰

{ 
    "_id" : "519817e508a16b447c00020e", #From Mongodb
    "keyword" : "Just an example query", 
    "date" : "2014-03-28"
    "rankings" :
    {
            "1" : { "domain" : "example1.com", "href" : "http://www.example1.com/", "plus" : "stuff1"},
            ...
            "100" : {"domain" : "example100.com", "href" : "http://www.example100.com/"plus" : "stuff100"}"}
    }, 
    "plus":"many", 
    "other":"not", 
    "interesting" : "stuff", 
    "for": "this question"
}

最佳答案

您建议的结构存在问题:

{
 keyword" : "Just an example query", 
 "rankings" :
    [{"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
     ...{ "rank" : 99, "domain" : "example99.com", "href" : "example99.com“}
 ]}
}

是不是虽然你现在可以做到

db.ranking.ensureIndex({"rankings.href":"text", "rankings.domain":"text"}) 

然后运行如下查询:

db.ranking.find({$text:{$search:"example1"}});

这将返回匹配数组元素的整个数组文档。

您可能需要考虑引用,以便每个排名结果都是一个单独的文档,并引用关键字和其他元数据,以避免重复大量信息。

因此,您有一个关键字/元数据文档,例如:

{_id:1, "keyword":"example query", "querydate": date, "other stuff":"other meta data"},
{_id:2, "keyword":"example query 2", "querydate": date, "other stuff":"other meta data 2"}

然后是结果文档,例如:

{keyword_id:1, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
... keyword_id:1, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"},
 keyword_id:2, {"rank" : 1, "domain" : "example1.com", "href" : "example1.com"},
 ...keyword_id:2, {"rank" : 99, "domain" : "example99.com", "href" : "example99.com"}}

其中 keyword_id 链接回(引用)关键字/元数据表——显然,在实践中,_id 看起来像“_id”:“519817e508a16b447c00020e”,但这只是为了便于阅读。您现在可以根据您的查询类型一起或单独索引 keyword_id、domain 和 href,并且您不会得到 index key pattern too large error,您只会得到一个匹配的文档,而不是比返回的整个数组。

我不完全清楚您在哪里需要模糊/正则表达式样式的搜索以及您是要搜索元数据还是只搜索 href 和域,但我认为这种结构应该是开始考虑索引的更清晰的方式,而不是最大化在索引上,和以前一样。它还允许您根据您的查询模式将普通索引的查找结果与文本索引结合起来。

您可能会找到这个答案 MongoDB relationships: embed or reference?在考虑文档结构时很有用。

关于Mongodb - 多文本索引 : Index key pattern too large error code 67,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25336130/

相关文章:

Excel 2010索引匹配VBA

mysql - 带外键和范围查询的索引设计

javascript - MongoDB 最大值查询和_id

javascript - AngularJS - Restheart API (MongoDB) - 解析 JSON 结果

node.js - 数字列表(或没有特定大小的数字数组)的 mongodb 模式数据类型

MongoDb:如何为具有许多可搜索字段的数据创建正确的(复合)索引

mongodb - mongo 查找所有具有指定键的对象的字段

c# - MongoDB 从子文档中删除子文档文档

mongodb - 将对象插入 Mongoose 中的数组模式

MongoDB查询,排序然后将第n个文档作为组