2016-09-21 2 views
1

Привет, у меня есть большая проблема с полным текстовым поиском, у меня есть коллекция с 10 миллионами документов, которая имеет много общих слов в индексированном поле, например: что, как, как, как, привет, привет, и т. д.MongoDB полнотекстовый поиск для общих слов

Когда я делаю aquery со словом «привет», поиск становится очень медленным и занимает около 30 минут, чтобы искать результаты, а с другой стороны, когда я делаю то же самое, но с необычным слово поиск супер быстрее и занимает менее 30 мс. Я не знаю, в чем проблема.

Мой текст индекс:

db.themes.createIndex({"theme":"text"}) 

и запрос, который я бегу:

db.themes.find({$text: {$search: "hi"}}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}}).limit(20) 
+0

Есть ли способ ограничить количество документов, которые вы собираетесь искать заранее? См. Здесь: https://docs.mongodb.com/manual/tutorial/limit-number-of-items-scanned-for-text-search/ – dyouberg

ответ

0

ну вот как это бывает. хотя mongodb предоставляет полнотекстовые возможности, но производительность не соответствует популярным поисковым системам.

Вы, вероятно, можете найти в Интернете, что в большинстве реализаций есть эластичный поиск, реализованный вместе с mongodb для оптимизации поиска. вы можете использовать эластичный поиск или Solr для своих операций.

0

Текстовый поиск MongoDB позорно замедляется на больших коллекциях. Мне также не нравится, как он автоматически думает, что «Джеймс Бонд» - это ИЛИ, но это еще одна история ... (для И, нужно искать «\» Джеймс \ "\" Бонд \ ", который неэлегантен в Лучший).

Один из способов обойти это, если ваше приложение позволяет это сделать, - это Limit the Number of Entries Scanned путем фильтрации по другим полям. Для этого нуждается в, чтобы быть равенством, он не может быть $ gt или такой. Возможно, вам придется проявить творческий подход к решению этого вопроса ... Я сгруппировал свои города в «мегаполисах» (это заняло некоторое время ...), и теперь я могу выполнить поиск по {metro: «DC», {$ text: {$ search: "pizza"}}.

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