Spring Data Mon go - выполнять регулярный поиск? - PullRequest
0 голосов
/ 20 февраля 2020

Я перебрал много ссылок, подобных этой: Как создать полнотекстовый поисковый запрос в mongodb с использованием данных Spring? , но не получил правильный подход.

У меня есть Коллекция сотрудников, которая содержит 1000 документов. Я хочу дать возможность выполнять поиск без учета случая, когда при поиске ra я должен получить имена Ravi, Ram, rasika et c.

Я использовал ниже logi c, который работает нормально, но я хотел понять с точки зрения производительности. Есть ли лучшее решение, чем это?

Query query = new Query(Criteria.where("employeeName").regex("^"+employeeName, "i")); 

1 Ответ

1 голос
/ 20 февраля 2020

Вы можете создать индекс для поля, к которому вы применяете фильтр запросов, используя регулярное выражение. Например, рассмотрим документы в коллекции person:

{ "name" : "ravi" }
{ "name" : "ram" }
{ "name" : "John" }
{ "name" : "renu" }
{ "name" : "Raj" }
{ "name" : "peter" }

Следующий запрос (запускается из Mon go Shell) находит и выбирает четыре документа с именами, начинающимися с буквы «r» или «R»:

db.person.find( { name: { $regex: "^r", $options: "i" } } )

Но запрос выполняет сканирование коллекции без индекса в поле name. Итак, создайте индекс на поле.

db.person.createIndex( { name: 1 } )

Теперь запустите запрос и сгенерируйте план запроса для того же запроса (используя explain()). План запроса показал, что это IXSCAN (индексированное сканирование). И это будет эффективно выполняемый запрос.

Обратите внимание, что поиск префикса (как в предыдущем запросе с использованием ^) по полям индекса приводит к более быстрым запросам.

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

Для запросов с регулярным выражением с учетом регистра, если для поля существует индекс, тогда MongoDB сопоставляет регулярное выражение со значениями в индексе, что может быть быстрее, чем сканирование коллекции. Дальнейшая оптимизация может произойти, если регулярное выражение является «префиксным выражением», что означает, что все потенциальные совпадения начинаются с одной и той же строки. Это позволяет MongoDB построить «диапазон» из этого префикса и сопоставлять его только с теми значениями из индекса, которые попадают в этот диапазон.

Хотя в документации сказано следующее (см. Ниже параграф), запрос Я использовал индекс, и план запроса, сгенерированный с использованием explain(), показал сканирование индекса.

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

...