Индексные границы поиска 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/