2016-09-17 4 views
2

Я работаю над функцией поиска поверх документов мангуста, где мне приходится искать более 250 000 документов. В этой функции я должен добавить индексы поиска по нескольким полям. В документах некоторые из полей являются строковыми типами, Некоторые из них являются объектами с несколькими уровнями. Я проиндексировал все возможные поля.Mongoose ускоряет поиск по нескольким полям

На местном уровне у меня есть 100 000 документов, и когда я просматриваю их, это заняло около 300-400 мс. Но когда я просматриваю их на сервере, на это потребовалось около 10-15 секунд.

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

$and(

{ 
    $or:[ 
     {'field1': {$regex: re }}, 
     {'field2': {$regex: re }}, 
     {'level1.level2.value': {$regex: re }} 
    ] 
}, 
{ 
    $and:[ 
     { 
      lowAge: {$lte: parseInt(age)} 
     }, 
     { 
      highAge: {$gte: parseInt(age)} 
     }, 
     { 
      $or:[ 
       { 
        gender:gender 
       }, 
       { 
        gender:"N/A" 
       } 
      ] 
     } 
    ] 
} 
) 

Может кто-нибудь посоветует мне, как я могу ускорить процесс на сервере.

+0

Я предполагаю, что ваш сервер недостаточно, с точки зрения ОЗУ, процессора или (возможно) обоих. Какой тип экземпляра вы используете? Кроме того, запросы регулярного выражения _can_ будут очень медленными, даже с индексами. По возможности старайтесь избегать их. – robertklep

+0

любая альтернатива, которую вы знаете, кроме регулярных выражений –

+0

Все зависит от того, как выглядят ваши запросы/регулярные выражения. – robertklep

ответ

0

Чтобы увеличить скорость, вы можете использовать индекс текста.

Но индекс текст поставляется со следующими требованиями хранения и производительность Затраты

  • Текстовые индексы могут быть большими. Они содержат одну запись индекса для каждого уникального слова post-stemmed в каждом индексированном поле для каждого вставленного документа.
  • Построение текстового индекса очень похоже на создание большого индекса с несколькими ключами и займет больше времени, чем построение простого упорядоченного (скалярного) индекса на одни и те же данные. При создании большого текстового индекса в существующей коллекции убедитесь, что у вас достаточно высокий предел для дескрипторов открытых файлов. См. Рекомендуемые настройки.
  • Текстовые индексы будут влиять на пропускную способность вставки, поскольку MongoDB должен добавлять индексную запись для каждого уникального слова post-stemmed в каждом индексированном поле каждого нового исходного документа.
  • Кроме того, текстовые индексы не содержат фраз или информации о близости слов в документах. В результате фразовые запросы будут выполняться намного эффективнее, если вся коллекция будет помещена в ОЗУ.

Пожалуйста, смотрите ссылки ниже

https://docs.mongodb.com/manual/core/index-text/

https://www.tutorialspoint.com/mongodb/mongodb_text_search.htm

Надеются, что это помогает!

+0

Я использовал текстовый поиск в других коллекциях, и, как я думаю, он работает в полях типа string.Теперь я должен искать по полю, как это, поэтому я могу определить текстовый индекс над кодом, который я только что добавил в новом редактировании. «Болезни»: [{«Болезнь»: [{«значение»: «Кистозный фиброз»}], «имя»: «CG»}, {«Болезнь»: [{"значение": "Cystic xx"} ], "name": "CI"}, {"Disease": [{"value": "Cystic xx"}], "name": "CI"} {"Disease": [{"value": «Cystic yys»}], «name»: «CI»} ], –

+0

Да, текстовый поиск работает только с строкой типа. Индекс, который нам нужно создать один раз, попробуйте создать его в оболочке mongo, и он будет использоваться в ваших поисковых запросах во время выполнения запроса на поиск в mongo shell/mongoose или любым другим способом. –

+0

@varun - Вы можете удалить условие '$ or' для пола, так как оно может принимать только 3 значения Male, Female или N/A, и вы включили все эти параметры в свой запрос. Таким образом, $ или операция не требуется, так как мы собираем запись в обоих случаях, присутствует ли пол или нет. –

Смежные вопросы