MongoDB использует индекс в запросе регулярного выражения - PullRequest
3 голосов
/ 08 декабря 2011

Я использую официальный драйвер C # MongoDB.

Если у меня есть индекс по трем элементам {"firstname": 1, "фамилия": 1, "companyname": 1}, можно ли выполнить поиск в коллекции с помощью регулярного выражения, которое напрямую соответствует значению индекса?

Итак, если кто-то вводит "солнечную летучую мышь" в качестве поискового запроса, я бы создал регулярное выражение следующим образом (? =. \ bsun) (? =. \ bbat). * И это должно совпадать с любыми индексными записями, где имя, фамилия или название компании начинаются с 'sun' И где имя, фамилия или название компании начинаются с ' летучая мышь».

Если я не могу сделать это таким образом, как я могу это сделать? Пользователь просто вводит свои поисковые термины, поэтому я не буду знать, к какому элементу (имя, фамилия, название компании) относится каждый поисковый запрос (sun или bat).

1 Ответ

7 голосов
/ 08 декабря 2011

Обновление : для MongoDB 2.4 и выше вы не должны использовать этот метод, вместо этого используйте текстовый индекс MongoDB .

Ниже приведен оригинальный и все еще актуальный ответ для MongoDB <2.4. </p>


Отличный вопрос. Имейте это в виду:

  1. MongoDB может использовать только один индекс для запроса.
  2. Запросы, использующие регулярные выражения, используют индекс только тогда, когда регулярное выражение укоренено и чувствительно к регистру.

Лучший способ выполнить поиск по нескольким полям - создать массив поисковых терминов (в нижнем регистре) для каждого документа и проиндексировать это поле. Для этого используется мультиключевая функция MongoDB.

Так что документ может выглядеть так:

{
    "firstname": "Tyler",
    "surname": "Brock",
    "companyname": "Awesome, Inc.",
    "search_terms": [ "tyler", "brock", "awesome inc"]
}

Вы бы создали индекс: db.users.ensureIndex({ "search_terms": 1 })

Затем, когда кто-то ищет «Тайлер», вы разбиваете регистр и ищете коллекцию, используя регулярное выражение с учетом регистра, соответствующее началу строки:

db.users.find({ "search_terms": /^tyler/ })

Что делает mongodb при выполнении этого запроса, так это пытается сопоставить ваш термин с каждым элементом массива (индекс также настраивается таким образом - так что это быстро). Надеюсь, это приведет вас туда, куда вам нужно, удачи.

Примечание: эти примеры находятся в оболочке. Я никогда не писал ни одной строки на C #, но понятия будут переводиться, даже если синтаксис может отличаться.

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