Mengindeks data dari Azure Cosmos DB untuk NoSQL untuk kueri di Azure AI Search

Dalam artikel ini, pelajari cara mengonfigurasi pengindeks yang mengimpor konten dari Azure Cosmos DB untuk NoSQL dan membuatnya dapat dicari di Azure AI Search.

Artikel ini melengkapi Buat pengindeks dengan informasi khusus untuk Cosmos DB. Ini menggunakan REST API untuk menunjukkan alur kerja tiga bagian yang umum untuk semua pengindeks: membuat sumber data, membuat indeks, membuat pengindeks. Ekstraksi data terjadi saat Anda mengirimkan permintaan Buat Pengindeks.

Karena terminologi dapat membingungkan, perlu dicatat bahwa pengindeksan Azure Cosmos DB dan pengindeksan Azure AI Search adalah operasi yang berbeda. Pengindeksan di Azure AI Search membuat dan memuat indeks pencarian di layanan pencarian Anda.

Prasyarat

  • Akun , database, kontainer, dan item Azure Cosmos DB. Gunakan wilayah yang sama untuk Azure AI Search dan Azure Cosmos DB untuk latensi yang lebih rendah dan untuk menghindari biaya bandwidth.

  • Kebijakan pengindeksan otomatis pada koleksi Azure Cosmos DB, diatur ke Konsisten. Ini adalah konfigurasi default. Pengindeksan malas tidak disarankan dan dapat mengakibatkan data yang hilang.

  • Izin baca. String koneksi "akses penuh" menyertakan kunci yang memberikan akses ke konten, tetapi jika Anda menggunakan Azure RBAC (MICROSOFT Entra ID), pastikan identitas terkelola layanan pencarian diberi Peran Pembaca Akun Cosmos DB dan Peran Pembaca Data Bawaan Cosmos DB.

  • Klien REST untuk membuat sumber data, indeks, dan pengindeks.

Menentukan sumber data

Definisi sumber data menentukan data untuk mengindeks, kredensial, dan kebijakan untuk mengidentifikasi perubahan dalam data. Sumber data adalah sumber daya independen yang dapat digunakan oleh beberapa pengindeks.

  1. Buat atau perbarui sumber data untuk mengatur definisinya:

    POST https://[service name].search.windows.net/datasources?api-version=2023-11-01
    Content-Type: application/json
    api-key: [Search service admin key]
    {
        "name": "[my-cosmosdb-ds]",
        "type": "cosmosdb",
        "credentials": {
          "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name]"
        },
        "container": {
          "name": "[my-cosmos-db-collection]",
          "query": null
        },
        "dataChangeDetectionPolicy": {
          "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "  highWaterMarkColumnName": "_ts"
        },
        "dataDeletionDetectionPolicy": null,
        "encryptionKey": null,
        "identity": null
    }
    
  2. Atur "jenis" ke "cosmosdb" (diperlukan). Jika Anda menggunakan Search API versi 2017-11-11 yang lebih lama, sintaks untuk "type" adalah "documentdb". Jika tidak, untuk 2019-05-06 dan yang lebih baru, gunakan "cosmosdb".

  3. Atur "kredensial" ke string koneksi. Bagian berikutnya menjelaskan format yang didukung.

  4. Atur "kontainer" ke koleksi. Properti "nama" diperlukan dan menentukan ID koleksi database yang akan diindeks. Properti "kueri" bersifat opsional. Gunakan untuk meratakan dokumen JSON arbitrer ke dalam skema datar yang dapat diindeks oleh Azure AI Search.

  5. Atur "dataChangeDetectionPolicy" jika data volatil dan Anda ingin pengindeks hanya mengambil item baru dan yang diperbarui pada eksekusi berikutnya.

  6. Atur "dataDeletionDetectionPolicy" jika Anda ingin menghapus dokumen pencarian dari indeks pencarian saat item sumber dihapus.

Kredensial dan string koneksi yang didukung

Pengindeks dapat tersambung ke koleksi menggunakan koneksi berikut.

Hindari nomor port di URL titik akhir. Jika Anda menyertakan nomor port, koneksi akan gagal.

Akses penuh string koneksi
{ "connectionString" : "AccountEndpoint=https://<Cosmos DB account name>.documents.azure.com;AccountKey=<Cosmos DB auth key>;Database=<Cosmos DB database id>" }'
Anda bisa mendapatkan string koneksi dari halaman akun Azure Cosmos DB di portal Azure dengan memilih Kunci di panel navigasi kiri. Pastikan untuk memilih string koneksi lengkap dan bukan hanya kunci.
Identitas terkelola string koneksi
{ "connectionString" : "ResourceId=/subscriptions/<your subscription ID>/resourceGroups/<your resource group name>/providers/Microsoft.DocumentDB/databaseAccounts/<your cosmos db account name>/;(ApiKind=[api-kind];)/(IdentityAuthType=[identity-auth-type])" }
String koneksi ini tidak memerlukan kunci akun, tetapi Anda harus memiliki layanan pencarian yang dapat tersambung menggunakan identitas terkelola. Untuk koneksi yang menargetkan API SQL, Anda dapat menghilangkan ApiKind dari string koneksi. Untuk informasi selengkapnya tentang ApiKind, IdentityAuthType lihat Menyiapkan koneksi pengindeks ke database Azure Cosmos DB menggunakan identitas terkelola.

Menggunakan kueri untuk membentuk data yang terindeks

Di properti "kueri" di bawah "kontainer", Anda dapat menentukan kueri SQL untuk meratakan properti atau array berlapis, memproyeksikan properti JSON, dan memfilter data yang akan diindeks.

Contoh dokumen:

    {
        "userId": 10001,
        "contact": {
            "firstName": "andy",
            "lastName": "hoh"
        },
        "company": "microsoft",
        "tags": ["azure", "cosmosdb", "search"]
    }

Kueri filter:

SELECT * FROM c WHERE c.company = "microsoft" and c._ts >= @HighWaterMark ORDER BY c._ts

Kueri perataan:

SELECT c.id, c.userId, c.contact.firstName, c.contact.lastName, c.company, c._ts FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Kueri proyeksi:

SELECT VALUE { "id":c.id, "Name":c.contact.firstName, "Company":c.company, "_ts":c._ts } FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Kueri perataan array:

SELECT c.id, c.userId, tag, c._ts FROM c JOIN tag IN c.tags WHERE c._ts >= @HighWaterMark ORDER BY c._ts

Kueri yang tidak didukung (DISTINCT dan GROUP BY)

Kueri yang menggunakan kata kunci DISTINCT atau klausa GROUP BY tidak didukung. Azure AI Search bergantung pada penomoran halaman kueri SQL untuk sepenuhnya menghitung hasil kueri. Baik kata kunci DISTINCT atau klausul GROUP BY tidak kompatibel dengan token kelanjutan yang digunakan untuk mem-paginate hasil.

Contoh kueri yang tidak didukung:

SELECT DISTINCT c.id, c.userId, c._ts FROM c WHERE c._ts >= @HighWaterMark ORDER BY c._ts

SELECT DISTINCT VALUE c.name FROM c ORDER BY c.name

SELECT TOP 4 COUNT(1) AS foodGroupCount, f.foodGroup FROM Food f GROUP BY f.foodGroup

Meskipun Azure Cosmos DB memiliki solusi untuk mendukung penomoran halaman kueri SQL dengan kata kunci DISTINCT dengan menggunakan klausul ORDER BY, itu tidak kompatibel dengan Azure AI Search. Kueri mengembalikan satu nilai JSON, sedangkan Azure AI Search mengharapkan objek JSON.

-- The following query returns a single JSON value and isn't supported by Azure AI Search
SELECT DISTINCT VALUE c.name FROM c ORDER BY c.name

Menambahkan bidang pencarian ke indeks

Dalam indeks pencarian, tambahkan bidang untuk menerima dokumen JSON sumber atau output proyeksi kueri kustom Anda. Pastikan bahwa skema indeks pencarian kompatibel dengan data sumber. Untuk konten di Azure Cosmos DB, skema indeks pencarian Anda harus sesuai dengan item Azure Cosmos DB di sumber data Anda.

  1. Buat atau perbarui indeks untuk menentukan bidang pencarian yang menyimpan data:

    POST https://[service name].search.windows.net/indexes?api-version=2023-11-01
    Content-Type: application/json
    api-key: [Search service admin key]
    {
        "name": "mysearchindex",
        "fields": [{
            "name": "rid",
            "type": "Edm.String",
            "key": true,
            "searchable": false
        }, 
        {
            "name": "description",
            "type": "Edm.String",
            "filterable": false,
            "searchable": true,
            "sortable": false,
            "facetable": false,
            "suggestions": true
        }
      ]
    }
    
  2. Buat bidang kunci dokumen ("key": true). Untuk koleksi yang dipartisi, kunci dokumen default adalah properti Azure Cosmos DB _rid , yang secara otomatis diganti namanya menjadi rid Azure AI Search karena nama bidang tidak dapat dimulai dengan karakter garis bawah. Selain itu, nilai Azure Cosmos DB _rid berisi karakter yang tidak valid di kunci Azure AI Search. Untuk alasan ini, nilai _rid dikodekan dengan Base64.

  3. Buat lebih banyak bidang untuk konten yang lebih dapat dicari. Lihat Membuat indeks untuk detailnya.

Jenis data pemetaan

Jenis data JSON Jenis bidang Pencarian Azure AI
Bool Edm.Boolean, Edm.String
Angka yang tampak seperti bilangan bulat Edm.Int32, Edm.Int64, Edm.String
Angka yang tampak seperti titik apung Edm.Double, Edm.String
String Edm.String
Array jenis primitif seperti ["a", "b", "c"] Kumpulan(Edm.String)
String yang tampak seperti tanggal Edm.DateTimeOffset, Edm.String
Objek GeoJSON seperti { "type": "Point", "coordinates": [long, lat] } Edm.GeographyPoint
Objek JSON yang lain T/A

Mengonfigurasi dan menjalankan pengindeks Azure Cosmos DB for NoSQL

Setelah indeks dan sumber data dibuat, Anda siap untuk membuat pengindeks. Konfigurasi pengindeks menentukan input, parameter, dan properti yang mengontrol perilaku run time.

  1. Buat atau perbarui pengindeks dengan memberinya nama dan mereferensikan sumber data dan indeks target:

    POST https://[service name].search.windows.net/indexers?api-version=2023-11-01
    Content-Type: application/json
    api-key: [search service admin key]
    {
        "name" : "[my-cosmosdb-indexer]",
        "dataSourceName" : "[my-cosmosdb-ds]",
        "targetIndexName" : "[my-search-index]",
        "disabled": null,
        "schedule": null,
        "parameters": {
            "batchSize": null,
            "maxFailedItems": 0,
            "maxFailedItemsPerBatch": 0,
            "base64EncodeKeys": false,
            "configuration": {}
            },
        "fieldMappings": [],
        "encryptionKey": null
    }
    
  2. Tentukan pemetaan bidang jika ada perbedaan dalam nama atau jenis bidang, atau jika Anda memerlukan beberapa versi bidang sumber dalam indeks pencarian.

  3. Lihat Membuat pengindeks untuk informasi selengkapnya tentang properti lain.

Pengindeks berjalan secara otomatis saat dibuat. Anda dapat mencegahnya dengan mengatur "dinonaktifkan" ke true. Untuk mengontrol eksekusi pengindeks, jalankan pengindeks sesuai permintaan atau letakkan sesuai jadwal.

Periksa status pengindeks

Untuk memantau status pengindeks dan riwayat eksekusi, kirim permintaan Dapatkan Status Pengindeks:

GET https://myservice.search.windows.net/indexers/myindexer/status?api-version=2023-11-01
  Content-Type: application/json  
  api-key: [admin key]

Respons mencakup status dan jumlah item yang diproses. Ini akan terlihat mirip dengan contoh berikut:

    {
        "status":"running",
        "lastResult": {
            "status":"success",
            "errorMessage":null,
            "startTime":"2022-02-21T00:23:24.957Z",
            "endTime":"2022-02-21T00:36:47.752Z",
            "errors":[],
            "itemsProcessed":1599501,
            "itemsFailed":0,
            "initialTrackingState":null,
            "finalTrackingState":null
        },
        "executionHistory":
        [
            {
                "status":"success",
                "errorMessage":null,
                "startTime":"2022-02-21T00:23:24.957Z",
                "endTime":"2022-02-21T00:36:47.752Z",
                "errors":[],
                "itemsProcessed":1599501,
                "itemsFailed":0,
                "initialTrackingState":null,
                "finalTrackingState":null
            },
            ... earlier history items
        ]
    }

Riwayat eksekusi berisi hingga 50 eksekusi yang terakhir selesai, yang diurutkan dalam urutan kronologis terbalik sehingga eksekusi terbaru menjadi yang pertama.

Mengindeks dokumen baru dan yang diubah

Setelah pengindeks mengisi indeks pencarian sepenuhnya, Anda mungkin ingin pengindeks berikutnya berjalan untuk mengindeks secara bertahap hanya dokumen baru dan yang diubah dalam database Anda.

Untuk mengaktifkan pengindeksan inkremental, atur properti "dataChangeDetectionPolicy" dalam definisi sumber data Anda. Properti ini memberi tahu pengindeks mekanisme pelacakan perubahan mana yang digunakan pada data Anda.

Untuk pengindeks Azure Cosmos DB, satu-satunya kebijakan yang HighWaterMarkChangeDetectionPolicy didukung adalah menggunakan _ts properti (tanda waktu) yang disediakan oleh Azure Cosmos DB.

Contoh berikut menunjukkan definisi sumber data dengan kebijakan deteksi perubahan:

"dataChangeDetectionPolicy": {
    "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
"  highWaterMarkColumnName": "_ts"
},

Pengindeksan inkremental dan kueri kustom

Jika Anda menggunakan kueri kustom untuk mengambil dokumen, pastikan kueri mengurutkan hasil menurut _ts kolom. Ini memungkinkan check-point berkala yang digunakan Azure AI Search untuk memberikan kemajuan inkremental jika terjadi kegagalan.

Dalam beberapa kasus, bahkan jika kueri Anda berisi ORDER BY [collection alias]._ts klausa, Azure AI Search mungkin tidak menyimpulkan bahwa kueri diurutkan oleh _ts. Anda dapat memberi tahu Azure AI Search bahwa hasil diurutkan dengan mengatur assumeOrderByHighWaterMarkColumn properti konfigurasi.

Untuk menentukan petunjuk ini, buat atau perbarui definisi pengindeks Anda sebagai berikut:

{
    ... other indexer definition properties
    "parameters" : {
        "configuration" : { "assumeOrderByHighWaterMarkColumn" : true } }
} 

Mengindeks dokumen yang telah dihapus

Saat baris dihapus dari kumpulan, Anda biasanya juga ingin menghapus baris tersebut dari indeks pencarian. Tujuan kebijakan deteksi perubahan data adalah untuk mengidentifikasi item data yang diubah secara efisien. Saat ini, satu-satunya kebijakan yang didukung adalah Soft Delete kebijakan (penghapusan ditandai dengan bendera semacam), yang ditentukan dalam definisi sumber data sebagai berikut:

"dataDeletionDetectionPolicy"": {
    "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
    "softDeleteColumnName" : "the property that specifies whether a document was deleted",
    "softDeleteMarkerValue" : "the value that identifies a document as deleted"
}

Jika Anda menggunakan kueri kustom, pastikan properti yang direferensikan oleh softDeleteColumnName diproyeksikan oleh kueri.

softDeleteColumnName harus berupa bidang tingkat atas dalam indeks. Menggunakan bidang berlapis dalam jenis data kompleks karena softDeleteColumnName tidak didukung.

Berikut ini contoh membuat sumber data dengan kebijakan penghapusan sementara:

POST https://[service name].search.windows.net/datasources?api-version=2023-11-01
Content-Type: application/json
api-key: [Search service admin key]

{
    "name": "[my-cosmosdb-ds]",
    "type": "cosmosdb",
    "credentials": {
        "connectionString": "AccountEndpoint=https://[cosmos-account-name].documents.azure.com;AccountKey=[cosmos-account-key];Database=[cosmos-database-name]"
    },
    "container": { "name": "[my-cosmos-collection]" },
    "dataChangeDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy",
        "highWaterMarkColumnName": "_ts"
    },
    "dataDeletionDetectionPolicy": {
        "@odata.type": "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy",
        "softDeleteColumnName": "isDeleted",
        "softDeleteMarkerValue": "true"
    }
}

Gunakan .NET

Untuk data yang diakses melalui protokol SQL API, Anda dapat menggunakan .NET SDK untuk mengotomatiskan dengan pengindeks. Sebaiknya tinjau bagian REST API sebelumnya untuk mempelajari konsep, alur kerja, dan persyaratan. Anda kemudian dapat merujuk ke dokumentasi referensi .NET API berikut untuk mengimplementasikan pengindeks JSON dalam kode terkelola:

Langkah berikutnya

Anda sekarang dapat mengontrol bagaimana Anda menjalankan pengindeks, memantau status, atau menjadwalkan eksekusi pengindeks. Artikel berikut ini berlaku untuk pengindeks yang menarik konten dari Azure Cosmos DB: