【问题标题】:Positional inverted index in MongoDBMongoDB中的位置倒排索引
【发布时间】:2012-02-21 18:03:37
【问题描述】:

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

假设我们有这个对象

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

我希望能够在必须连接“apollo”和“landings”的地方进行查询,而不仅仅是进行“intersection”查询。

【问题讨论】:

    标签: java mongodb indexing


    【解决方案1】:

    像这样的对象呢:

    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 来检查输入关键字的相对位置。

    【讨论】:

      【解决方案2】:

      您可以使用 $and 或 $all 运算符来完成我认为您希望完成的事情。

      鉴于您的示例文档:

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

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

      > 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

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

      【讨论】:

      • 我的问题可能写得不好,但我想解决的问题是查询应该只返回“apollo”和“landings”彼此相邻的结果,例如在短语中查询“阿波罗登陆”。如果我有一个带有“阿波罗 xxxx 着陆”的文本,则查询不应将其作为结果返回,因为它不是一个短语。是否可以进行这样的查询?
      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      相关资源
      最近更新 更多