MongoDB - Разница между индексом в текстовом поле и текстовым индексом?

Для поля MongoDB, содержащего строки (например, имена состояний или областей), какая (если есть) разница между созданием индекса в поле строкового типа:

db.ensureIndex( { field: 1 } )

и создания текстового индекса в этом поле:

db.ensureIndex( { field: "text" }

Где, в обоих случаях, field имеет тип string.

Я ищу способ сделать нечувствительный к регистру поиск в текстовом поле, которое будет содержать одно слово (может быть, больше). Будучи новичком в Mongo, у меня возникли проблемы с различием между использованием вышеупомянутых двух методов индекса и даже чем-то вроде поиска $regex.

Ответ 1

Два параметра индекса очень разные.

  • При создании регулярного индекса в поле строки он индексирует целое значение в строке. В основном полезно для строк с одним словом (например, имя пользователя для логинов), где вы можете точно соответствовать.

  • Текстовый индекс на другом жестком уровне будет означать и блокировать содержимое поле. Таким образом, он разбивает строку на отдельные слова или и еще больше уменьшат их до своих стеблей, чтобы варианты того же слова будет соответствовать ( "говорить", соглашаясь "переговоры", "разговаривали" и "говорить", например, поскольку "разговор" - это основа всех трех). В основном полезно для истинного текста (предложения, параграфы и т.д.).

    Текстовый поиск

    Текстовый поиск поддерживает поиск содержимого строки в документах коллекция. MongoDB предоставляет оператор $text для выполнения текстового поиска в запросах и в агрегатных конвейерах.

    Процесс текстового поиска:

    tokenizes and stems the search term(s) during both the index creation and the text command execution.
    assigns a score to each document that contains the search term in the indexed fields. The score determines the relevance of a document to a given search query.
    

    Оператор $text может искать слова и фразы. Запрос совпадает на полных словах. Например, если поле документа содержит слово blueberry, поиск по термину blue не будет соответствовать документ. Однако поиск на чернике или чернике будет соответствовать.

  • $regex поиск может использоваться с регулярными индексами в строковых полях, обеспечить сопоставление шаблонов и поиск подстановочных знаков. Не ужасно эффективный пользователь индексов, но он будет использовать индексы, где он может:

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

http://docs.mongodb.org/manual/core/index-text/

http://docs.mongodb.org/manual/reference/operator/query/regex/

Ответ 2

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

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

Итак, почему текстовый индекс и его последующие поиски быстрее, чем регулярное выражение в неиндексированном текстовом поле? Это потому, что текстовые индексы работают как словарь, умный, способный отбрасывать слова на основе каждого языка (по умолчанию используется английский). Когда вы запускаете текстовый запрос, вы запускаете его против словаря, сохраняя время, которое в противном случае было бы потрачено на итерацию по всей коллекции.

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

A регулярный индекс в текстовом поле, например

db.ensureIndex( { field: 1 } )

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