Есть ли способ оптимизировать автозаполнение запроса по ключевым словам в монго - PullRequest
3 голосов
/ 29 марта 2012

Я создаю службу автозаполнения для моей коллекции сообщений mongo db, где пользователь может начать вводить заголовок сообщения.Он должен вернуть все сообщения с этим ключевым словом в заголовке и отсортировать их по полю «total».

У меня есть поле «lower», которое является строчной версией поля заголовка, которое мы хотим найти, ина котором установлен индекс.Так как я ищу любое совпадение по ключевому слову, я выполняю поиск по регулярному выражению по LowerCaseTitle для слов, которые появляются в любом месте заголовка, а не только в начале.

Я посмотрел план выполнения, и похоже, чтосканировать каждый элемент (в полной коллекции сообщений 10061 элемент).Я попытался намекнуть как на индекс «lower_1», так и на индекс «total_-1», и они кажутся похожими, но общий индекс кажется лучше с меньшим nscanned числом, если я установил для запроса ограничение в 50.Что я могу сделать, чтобы оптимизировать?Я не могу придумать ничего простого из головы для такого рода полнотекстового поиска.

"cursor" : "BtreeCursor lower_1",
    "nscanned" : 10061,
    "nscannedObjects" : 2,
    "n" : 2,
    "scanAndOrder" : true,
    "millis" : 154,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "lower" : [
            [
                "",
                {

                }
            ]
        ]
    }

1 Ответ

6 голосов
/ 29 марта 2012

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

Из документации :

Для простых запросов с префиксами (также называемых корневыми регулярными выражениями), таких как /^prefix/,, база данных будет использовать индекс, когда он доступен и уместен (во многом как большинство баз данных SQL, которые используют индексы для выражения LIKE 'prefix%'). Это работает, только если у вас нет i (нечувствительность к регистру) в флагах.

Другими словами, нет, MongoDB не поддерживает быстрый поиск подстрок.

Однако вы можете сделать следующее для поддержки слов, начинающихся с данной строки:

BlogPost { 
  Title : "This is furiously interesting post"
  TitleSearch : [ "this", "is", "furiously", "interesting", "post" ]
}

Теперь, с индексированием TitleSearch и использованием корневого регулярного выражения, поиск 'inter' вернул бы образец, также для 'furious', но не для 'eresting'.

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