MongoDB индексирует большое текстовое поле, кажется, не делает запрос быстрее? - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть 1,5 миллиона записей, каждая с текстовым полем «тело», которое содержит много текста.Я выполняю полнотекстовый поиск по этим документам с помощью регулярного выражения, но не заметил никакой разницы во времени запросов между индексированием данных и их отсутствием.

Я убедился, что индекс "поле body через

db.documents.ensureIndex({ body: 1 });

MongoDB заняло несколько минут для индексации данных, и когда я запустил

db.documents.getIndexes()

, он показалчто у меня был индекс в поле "тело" коллекции.Но запросы по-прежнему занимают одинаковое количество времени до и после индексации.

Если я выполню запрос

db.documents.find({ body: /test/i });

, я ожидаю, что он будет выполняться быстрее, поскольку данныеиндексируется.Когда я делаю

db.documents.find({ body: /test/i }).explain();

Монго говорит мне, что он использует BTreeCursor на поле тела.

Я что-то здесь не так делаю?Почему бы после того, как текстовые данные были проиндексированы, не было бы уменьшения времени запроса?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

Проверьте документы для индексов и запросов регулярных выражений:

http://www.mongodb.org/display/DOCS/Advanced+Queries

Для простых префиксных запросов (также называемых корневыми регулярными выражениями), таких как / ^ prefix /, база данных будет использовать индекс, когда он доступен и уместен как и большинство баз данных SQL, которые используют индексы для LIKE 'префикса%' выражение). Это работает только если у вас нет I (нечувствительность к регистру) во флаги.

1 голос
/ 03 апреля 2012

Полнотекстовый поиск - это специальная область, где MongoDb действительно не подходит.

Если вы ищете что-то с открытым исходным кодом и быстро, вы должны попробовать Apache SOLR. Мы используем его уже 4 года, отличное качество!

http://lucene.apache.org/solr/

0 голосов
/ 30 июня 2015

Вам необходимо создать поисковый индекс ТЕКСТ на поле.

 db.documents.ensureIndex({ body: "text" });

после создания поискового индекса TEXT вы можете выполнить поиск следующим образом:

 db.documents.find({ "$text": {"$search" : /test/i} });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...