Поделиться через


Поиск и запрос с текстовыми индексами в Azure Cosmos DB для виртуальных ядер MongoDB

Область применения: Виртуальные ядра MongoDB

Одной из ключевых функций, предоставляемых виртуальным ядром Azure Cosmos DB для MongoDB, является индексирование текста, что позволяет эффективно выполнять поиск и запросы текстовых данных. Служба реализует текстовые индексы версии 2 . Версия 2 поддерживает конфиденциальность регистра, но не диакритические чувствительность.

Текстовые индексы в Azure Cosmos DB для MongoDB — это специальные структуры данных, которые оптимизируют текстовые запросы, что делает их более быстрыми и эффективными. Они предназначены для обработки текстового содержимого, например документов, статей, комментариев или других текстовых данных. Текстовые индексы используют такие методы, как маркеризация, стебливание и остановка слов для создания индекса, который повышает производительность поиска на основе текста.

Необходимые компоненты

Определение текстового индекса

Для простоты рассмотрим пример приложения блога со следующей настройкой:

  • Имя базы данных: cosmicworks
  • Имя коллекции: products

В этом примере приложения хранятся статьи в виде документов со следующей структурой:

{
  "_id": ObjectId("617a34e7a867530bff1b2346"),
  "title": "Azure Cosmos DB - A Game Changer",
  "content": "Azure Cosmos DB is a globally distributed, multi-model database service.",
  "author": "John Doe",
  "category": "Technology",
  "published": true
}
  1. createIndex Используйте метод с text параметром для создания текстового title индекса в поле.

    use cosmicworks;
    
    db.products.createIndex({ title: "text" })
    

    Примечание.

    Хотя вы можете определить только один текстовый индекс для каждой коллекции, Azure Cosmos DB для виртуального ядра MongoDB позволяет создавать текстовые индексы в нескольких полях, чтобы обеспечить выполнение поиска текста в разных полях в документах.

  2. При необходимости создайте индекс для поддержки поиска в обоих title полях и content в обоих полях.

    db.products.createIndex({ title: "text", content: "text" })
    

Настройка параметров текстового индекса

Текстовые индексы в Azure Cosmos DB для MongoDB доступны с несколькими параметрами для настройки их поведения. Например, можно указать язык для анализа текста, задать весовые значения для определения приоритета определенных полей и настроить поиск без учета регистра. Ниже приведен пример создания текстового индекса с параметрами:

  1. Создайте индекс для поддержки поиска как по полям, так title и content с поддержкой английского языка. Кроме того, присвойте полю более высокий вес, чтобы определить приоритет в результатах title поиска.

    db.products.createIndex(
        { title: "text", content: "text" },
        { default_language: "english", weights: { title: 10, content: 5 }, caseSensitive: false }
    )
    

Весовые значения в текстовых индексах

При создании текстового индекса можно назначить разные веса отдельным полям в индексе. Эти весы представляют важность или релевантность каждого поля в поиске. Azure Cosmos DB для виртуального ядра MongoDB вычисляет оценку и назначает вес для каждого документа на основе условий поиска при выполнении текстового запроса поиска. Оценка представляет релевантность документа к поисковому запросу.

  1. Создайте индекс для поддержки поиска в обоих title полях и content в обоих полях. Назначьте вес 2 полю "заголовок" и вес 1 полю "содержимое".

    db.products.createIndex(
    { title: "text", content: "text" },
    { weights: { title: 2, content: 1 } }
    )
    

    Примечание.

    Когда клиент выполняет текстовый поисковый запрос с термином Cosmos DB, оценка каждого документа в коллекции будет вычисляться на основе наличия и частоты термина в полях "title" и "content", с более высоким значением поля "заголовок" из-за его более высокого веса.

Выполнение поиска текста с помощью текстового индекса

После создания текстового индекса можно выполнять поиск текста с помощью оператора text в запросах. Оператор текста принимает строку поиска и сопоставляет ее с текстовым индексом, чтобы найти соответствующие документы.

  1. Выполните поиск текста для фразы Cosmos DB.

    db.products.find(
        { $text: { $search: "Cosmos DB" } }
    )
    
  2. При необходимости используйте $meta оператор проекции вместе с textScore полем в запросе, чтобы просмотреть вес

    db.products.find(
        { $text: { $search: "Cosmos DB" } },
        { score: { $meta: "textScore" } }
    )
    

Удаление текстового индекса

Чтобы удалить текстовый индекс в MongoDB, можно использовать dropIndex() метод в коллекции и указать ключ индекса или имя текстового индекса, который требуется удалить.

  1. Удалите текстовый индекс, явно указав ключ.

    db.products.dropIndex({ title: "text" })
    
  2. При необходимости удалите текстовый индекс, указав автоматическое уникальное имя.

    db.products.dropIndex("title_text")
    

Ограничения индексов текста

  • В коллекции можно определить только один текстовый индекс.
  • Индексы текста поддерживают простой поиск текста и не предоставляют расширенные возможности поиска, такие как поиск регулярных выражений.
  • Hint() не поддерживается в сочетании с запросом с помощью выражения $text.
  • Операции сортировки не могут использовать упорядочение текстового индекса в MongoDB.
  • Текстовые индексы могут быть относительно большими, потребляя значительное место в хранилище по сравнению с другими типами индексов.

Следующий шаг