MongoDB中的位置倒排索引

时间:2012-01-29 18:13:56

标签: java mongodb indexing

我想知道如何在MongoDB中实现位置倒置索引。通过使用多键功能,可以创建反向索引,但是如何以有效的方式存储也可以存储出现的位置?

我们说我们有这个对象

obj = {
  name: "Apollo",
  text: "Some text about Apollo moon landings",
  keywords: [ "some", "text", "about", "apollo", "moon", "landings" ]
}

我知道能够查询" apollo"和#34;着陆"必须连接起来,而不仅仅是建立一个交叉点"查询。

2 个答案:

答案 0 :(得分:2)

如下对象:

obj = {
  name: "Apollo",
  text: "Some text about Apollo moon landings",
  keywords: [
    {idx:0, text: "some"},
    {idx:1, text: "text"}, 
    {idx:2, text: "about"}, 
    {idx:3, text: "apollo"}, 
    {idx:4, text: "moon"}, 
    {idx:5, text: "landings"}
  ]
}

您可以对“keywords.text”执行ensureIndex,以执行两个关键字都存在的查询,然后在“where”过滤器中使用javascript来检查输入关键字的相对位置。

答案 1 :(得分:1)

你可以使用$和或$ all运算符来做我认为你想要完成的事情。

给出您的示例文档:

> db.test.find().pretty()
{
    "_id" : ObjectId("4f26b716c27b085280a45a29"),
    "name" : "Apollo",
    "text" : "Some text about Apollo moon landings",
    "keywords" : [
        "some",
        "text",
        "about",
        "apollo",
        "moon",
        "landings"
    ]
}

您可以使用$和运算符搜索“keywords”数组包含两个单词的文档。

> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]})
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] }
> 

$ all运算符将返回相同的结果,并且查询稍微简化:

> db.test.find({keywords:{$all:["apollo", "landings"]}})
{ "_id" : ObjectId("4f26b716c27b085280a45a29"), "name" : "Apollo", "text" : "Some text about Apollo moon landings", "keywords" : [ "some", "text", "about", "apollo", "moon", "landings" ] }

如果我们在关键字数组上放置索引,则两个查询都会使用它。

> db.test.ensureIndex({keywords:1})
> db.test.find({$and:[{keywords:"apollo"}, {keywords:"landings"}]}).explain()
{
    "cursor" : "BtreeCursor keywords_1",
    "nscanned" : 1,
    "nscannedObjects" : 1,
    "n" : 1,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "keywords" : [
            [
                "apollo",
                "apollo"
            ]
        ]
    }
}
> db.test.find({keywords:{$all:["apollo", "landings"]}}).explain()
{
    "cursor" : "BtreeCursor keywords_1",
    "nscanned" : 1,
    "nscannedObjects" : 1,
    "n" : 1,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "keywords" : [
            [
                "apollo",
                "apollo"
            ]
        ]
    }
}
> 

两个查询都使用关键字索引。

有关不同类型查询的详细信息,请参阅“高级查询”文档 http://www.mongodb.org/display/DOCS/Advanced+Queries

有关索引如何在Mongo中工作的更多信息,请参阅“索引”文档 http://www.mongodb.org/display/DOCS/Indexes#Indexes-IndexingArrayElements

“索引数组元素”部分链接到MultiKeys上的文档。 http://www.mongodb.org/display/DOCS/Multikeys

如果你不熟悉mongodb的.explain函数,可以在这里解释: http://www.mongodb.org/display/DOCS/Explain 简而言之,它显示您的查询正在使用的任何索引,以及需要访问多少文档才能返回相关的索引。

最后,你的问题似乎与今天早些时候要求在数组中搜索值的另一个用户类似。也许这也与你有关 http://groups.google.com/group/mongodb-user/browse_thread/thread/38f30a56094d9e3e

希望这可以帮助您编写您正在寻找的查询。如果您有任何后续问题,请告诉我们!