WedX - журнал о программировании и компьютерных науках

Как я могу проиндексировать эту таблицу MongoDB для поиска?

У меня есть коллекция «клиентов» с такой структурой данных, и мне нужно искать по имени, фамилии или дате рождения на корневом уровне или в записях AlternateClientData:

{
    "_id" : GUID,
    "FirstName" : "string",
    "LastName" : "string",
    "DateOfBirth" : "YYYY-MM-dd",
    "AlternateClientData" : [ 
        {
            "AccountId" : GUID,
            "FirstName" : "string",
            "LastName" : "string",
            "DateOfBirth" : "string",
        }, 
    ]
}

Я использую драйвер С# Mongo, и поисковый запрос выглядит примерно так:

"filter": {
    "AlternateClientData": {
      "$elemMatch": {
        "AccountId": {
          "$ne": null,
          "$in": [ /* one or many account IDs */]
        }
      }
    },
    "$or": [
      {
        "FirstName": {
          "$regex": "^FName",
          "$options": "i"
        }
      },
      {
        "AlternateClientData": {
          "$elemMatch": {
            "FirstName": {
              "$regex": "^FName",
              "$options": "i"
            }
          }
        }
      },
      {
        "LastName": {
          "$regex": "^LName",
          "$options": "i"
        }
      },
      {
        "AlternateClientData": {
          "$elemMatch": {
            "LastName": {
            "$regex": "^LName",
              "$options": "i"
            }
          }
        }
      },
      {
        "DateOfBirth": "1970-01-01"
      },
      {
        "AlternateClientData": {
          "$elemMatch": {
            "DateOfBirth": "1970-01-01"
          }
        }
      }
    ]
  }

Я попытался добавить такой индекс, но монго его не использует:

{
    "FirstName" : NumberLong(1),
    "LastName" : NumberLong(1),
    "DateOfBirth" : NumberLong(1),
    "AlternateClientData.FirstName" : NumberLong(1),
    "AlternateClientData.LastName" : NumberLong(1),
    "AlternateClientData.DateOfBirth" : NumberLong(1),
    "AlternateClientData.AccountId" : NumberLong(1)
}

Примечание: я спорил с власть имущими о том, что нам нужно потратить время на создание надлежащего поискового сервиса с использованием чего-то вроде Elastic Search, но на данный момент это не является приоритетом, поэтому я пока застрял на Mongo. Единственное, что осталось сделать на данный момент, это создать отдельную коллекцию для поиска и сгладить + проиндексировать доступные для поиска данные?

24.08.2020

Ответы:


1

Есть много способов создать index. В одном из них вы можете определить индексы на уровне данных (при создании модели), например;

@Indexed(sparse = true, 
         unique = false, 
         background = true,
         direction = IndexDirection.ASCENDING, 
         name = "MyIndex",
         expireAfterSeconds = 12000,
         useGeneratedName = false)
@Field("widgetName")
 private String lastname;

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

db.products.createIndex( { "FirstName": 1, "LastName": 1, "DateOfBirth": 1, "AlternateClientData.FirstName": 1 , "AlternateClientData.LastName": 1 , "AlternateClientData.DateOfBirth": 1 , "AlternateClientData.AccountId": 1 } )

если возникнут проблемы с индексами, обратитесь к официальной документации; https://docs.mongodb.com/manual/indexes/

24.08.2020
  • некоторые из них должны быть индексами $text, он использует регулярное выражение. Я тоже не думаю, что расположение указателя правильное. 25.08.2020
  • Для текстового индекса все иначе. Вы можете использовать только один атрибут в коллекции для этого типа индекса. $regex работает для всех индексов. 26.08.2020
  • спасибо за разъяснения, я, вероятно, запутался с операциями запроса $text 26.08.2020
  • Спасибо за ответ. Приведенный вами пример индекса такой же, как и тот, который я дал, но Mongo по какой-то причине не использует. Любые идеи, почему он не будет использовать этот индекс? Может быть, это потому, что запрос не всегда содержит имя и фамилию? Иногда то одно, то другое. 27.08.2020
  • что внутри вашего $match ? 06.09.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]