Какова стратегия индексирования для переменного запроса?

#mongodb

#mongodb

Вопрос:

Наиболее распространенным вариантом использования для этого, вероятно, будет таблица пользователей с именем, lname, email, phone.

Я мог бы искать имя, содержащее «paul», электронное письмо содержит 2 @yahoo»

Я мог бы искать phone = 01234567890

Я мог бы искать email = «foo@bar.com »

Насколько я понимаю, в индексе mongo все работает по порядку. Итак, индекс, который выглядит как name: 1, lname: 1, email: 1, phone: 1, не будет работать ни для одного из вышеперечисленных запросов?

Какова наилучшая стратегия индексации для учета таких таблиц поиска?

Комментарии:

1. вам следует взглянуть на MongoDB Atlas Search. Вы можете сделать это очень легко с помощью индекса подстановочных знаков. Хотите пример запроса.

2. docs.atlas.mongodb.com/reference/atlas-search/…

3. @Nice-Guy Да, пожалуйста, это похоже на то, что я ищу!

4. Если вам нужны такие функции, как автозаполнение и прочее, вы можете достичь всего этого с помощью Atlas Search. Итак, просто держите меня в курсе, если приведенный ниже подход находится в правильном направлении.

5. Я также добавил запрос, который вы предложили. Это будет работать очень хорошо для вас. Если вы часто обновляете свои документы, вам нужно быть в порядке с возможной согласованностью. Для большинства поисковых запросов это нормально. Данные должны реплицироваться относительно быстро.

Ответ №1:

итак, пол, вам нужно будет создать определение индекса, прежде чем вы сможете выполнить запрос. Создание первого определения индекса поиска в представлении коллекции в Atlas Data Explorer может быть непростой задачей.

Вот что я бы рекомендовал для определения индекса на основе этих документов:

 {
  "mappings": {
    "fields": {
      "email": {
        "analyzer": "lucene.keyword",
        "type": "string"
      },
      "phone": {
        "analyzer": "lucene.keyword",
        "type": "string"
      },
      "name": {
        "analyzer": "lucene.keyword",
        "type": "string"
      },
      "lname": {
        "analyzer": "lucene.keyword",
        "type": "string"
      }

    }
  }
}
 

Вот что я бы рекомендовал для запроса в стиле contains в полях email и name:

   { 
       $search: {
        index: 'default',
        compound: {
          must: [{
            wildcard: {
              query: '*paul*',
              path: 'name'
              }
            },{
            wildcard: {
              query: '*2@yahoo*',
              path: 'email'
            }
        }]
      }
   }
}
 

Должен быть молниеносный запрос, даже для большого индекса, и как одно из нескольких предложений, как вы описали. Дайте мне знать, если у вас возникнут еще какие-либо проблемы. Есть много функций, таких как выделение, которые также должны быть полезны. Обратите внимание, что этот запрос представляет собой одно предложение. Если вам нужно несколько предложений, как вы описали, вставьте это предложение в compound оператор, как показано здесь .

Комментарии:

1. Это великолепно, спасибо. Я попробую, но это выглядит именно так, как я ищу