Позиционно-инвертированный индекс в MongoDB - PullRequest
0 голосов
/ 29 января 2012

Интересно, как можно было бы реализовать позиционный инвертированный индекс в MongoDB. Используя функцию мультиключа, можно создать инвертированный индекс, но как можно эффективно хранить также положения вхождений?

Допустим, у нас есть этот объект

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

Я хотел бы знать, что я мог бы сделать запрос, где "apollo" и "лендинги" должны быть связаны, а не просто сделать запрос "пересечения".

Ответы [ 2 ]

2 голосов
/ 30 января 2012

А как насчет объекта типа:

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"}
  ]
}

Вы можете сделать sureIndex для "words.text ", чтобы выполнить запрос, где существуют оба ключевых слова, а затем использовать javascript в фильтре" где ", чтобы проверить относительные позиции входных ключевых слов.

1 голос
/ 30 января 2012

Вы можете использовать оператор $ или $ all, чтобы сделать то, что, я считаю, вы хотите достичь.

С учетом вашего примера документа:

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

Вы можете использовать оператор $ и для поиска документа, в массиве ключевых слов которого содержатся оба слова.

> 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

Если вы не знакомы с функцией .explain в mongodb, это объясняется здесь: http://www.mongodb.org/display/DOCS/Explain В двух словах, он отображает все индексы, которые использует ваш запрос, и количество документов.необходимо получить доступ, чтобы вернуть соответствующие.

Наконец, ваш вопрос похож на вопрос другого пользователя, который спрашивал о поиске значений в массивах ранее этим утром.Возможно, это будет иметь отношение и к вам.
http://groups.google.com/group/mongodb-user/browse_thread/thread/38f30a56094d9e3e

Надеюсь, это поможет вам написать запрос, который вы ищете.Пожалуйста, дайте нам знать, если у вас есть дополнительные вопросы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...