Индексные границы поиска Mongo Regex

Я использую MongoDB, и у меня есть набор документов со следующей структурой:

{
    fName:"Foo",
    lName:"Barius",
    email:"[email protected]",
    search:"foo barius"
}

Я создаю функцию, которая будет выполнять поиск регулярных выражений в поле search. Чтобы оптимизировать производительность, я проиндексировал эту коллекцию в поле поиска. Однако все еще немного медленнее. Поэтому я запрограммировал explain() на пример запроса:

db.Collection.find({search:/bar/}).explain();

В соответствии с планом выигрыша, я вижу следующие используемые значения индексов:

"search": [
        "[\"\", {})",
        "[/.*bar.*/, /.*bar.*/]"
]

Второй набор имеет смысл - он смотрит на все, что содержит бар, на все, что содержит бар. Однако первый набор меня озадачивает. Кажется, он смотрит в пределах "" включительно до {} exclusive. Я обеспокоен тем, что этот дополнительный набор ограничений замедляет мой запрос. Нужно ли держать? Если это не так, как я могу предотвратить его включение?

Ответы

Ответ 1

Я думаю, что это так, как mongodb работает с регулярным выражением (см. https://scalegrid.io/blog/mongodb-regular-expressions-indexes-performance/). Просто следите за значением nscanned/totalKeysExamined, если оно слишком велико, индекс бесполезен для вашего запроса.

См. также: MongoDB, производительность запроса по регулярному выражению в индексированных полях

Ответ 2

Таким образом, манго работает с этим типом регулярного выражения и индексом. Я имею в виду, что вы ищете/bar/вместо/^ bar/.

Когда вы указываете индекс в этом поле, он индексируется от первого символа. Таким образом, "Foo barius" индексируется начиная с F. Поскольку вы ищете "бар" в любом месте поля, вам нужно искать весь индекс в этом поле, смотрящий * bar *.

Первая строка в вашем объяснении говорит о каждой записи в индексе.

Во второй строке скажите, дайте мне только те индексы из (1), которые имеют в них бар.

Нижняя строка: создайте свои записи, чтобы они эффективно использовали индекс. В случае строк убедитесь, что ваши поисковые запросы находятся в начале строки, например, /^ bar/. Если я буду искать по фамилии, тогда это должно произойти сначала в индексированном поле.

В качестве упражнения сделайте объяснение на /^ bar/вместо этого. Вы не получите свои данные, но первые оценки индекса будут такими, как /^ bar/to/^ bas/.

Надеюсь, что мой поток сознания поможет.

UDude

Ответ 3

Думаю, я бы добавил свои два цента.

Предыдущие два ответа верны. Выражение регулярного выражения может использовать только стандартный индекс, если вы начинаете поиск с самого начала. На самом деле, наличие индекса и поиск по регулярному выражению могут иметь пагубное влияние на ваш поиск, потому что он пытается использовать индекс, но не будет успешным.

Существует еще один тип индекса, который может быть полезен в вашей ситуации. Монгольский текстовый индекс. Он индексирует каждое слово на основе пробелов, поэтому он сможет выполнять индексированный поиск по словам "foo" и "barius", что может быть более полезным

Здесь документы для этого: https://docs.mongodb.com/manual/core/index-text/