Memetakan output yang diperkaya ke bidang dalam indeks pencarian di Azure AI Search
Artikel ini menjelaskan cara menyiapkan pemetaan bidang output, menentukan jalur data antara data dalam memori yang dihasilkan selama pemrosesan set keterampilan, dan bidang target dalam indeks pencarian. Selama eksekusi pengindeks, informasi yang dihasilkan keterampilan hanya ada dalam memori. Untuk mempertahankan informasi ini dalam indeks pencarian, Anda perlu memberi tahu pengindeks tempat mengirim data.
Pemetaan bidang output ditentukan dalam pengindeks dan memiliki elemen berikut:
"outputFieldMappings": [
{
"sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
"targetFieldName": "some-search-field-in-an-index",
"mappingFunction": null
}
],
Berbeda dengan fieldMappings
definisi yang memetakan jalur antara bidang sumber verbatim dan bidang indeks, definisi outputFieldMappings
memetakan pengayaan dalam memori ke bidang dalam indeks pencarian.
Prasyarat
Pengindeks, indeks, sumber data, dan set keterampilan.
Bidang indeks harus bidang sederhana atau tingkat atas. Anda tidak dapat menghasilkan ke jenis kompleks. Namun, jika Anda memiliki jenis kompleks, Anda dapat menggunakan definisi bidang output untuk meratakan bagian dari jenis kompleks dan mengirimkannya ke koleksi dalam indeks pencarian.
Kapan menggunakan pemetaan bidang output
Pemetaan bidang output diperlukan jika pengindeks Anda memiliki set keterampilan terlampir yang membuat informasi baru yang Anda inginkan dalam indeks Anda. Contohnya meliputi:
- Vektor dari keterampilan penyematan
- Teks pengenalan karakter optik (OCR) dari keterampilan gambar
- Lokasi, organisasi, atau orang dari keterampilan pengenalan entitas
Pemetaan bidang output juga dapat digunakan untuk:
Buat beberapa salinan konten yang Anda hasilkan (pemetaan bidang output satu-ke-banyak).
Meratakan jenis kompleks dokumen sumber. Misalnya, asumsikan dokumen sumber memiliki jenis kompleks, seperti alamat multibagian, dan Anda hanya menginginkan kota. Anda dapat menggunakan pemetaan bidang output untuk meratakan struktur data berlapis, lalu menggunakan pemetaan bidang output untuk mengirim output ke kumpulan string dalam indeks pencarian Anda.
Pemetaan bidang output hanya diterapkan untuk indeks pencarian. Jika Anda mengisi penyimpanan pengetahuan, gunakan proyeksi untuk konfigurasi jalur data.
Menentukan pemetaan bidang output
Pemetaan bidang output ditambahkan ke outputFieldMappings
array dalam definisi pengindeks, biasanya ditempatkan setelah fieldMappings
array. Pemetaan bidang output terdiri dari tiga bagian.
Anda dapat menggunakan REST API atau Azure SDK untuk menentukan pemetaan bidang output.
Tip
Pengindeks yang dibuat oleh wizard Impor data menyertakan pemetaan bidang output yang dihasilkan oleh wizard. Jika Anda memerlukan contoh, jalankan wizard di atas sumber data Anda untuk melihat pemetaan bidang output di pengindeks.
Gunakan Buat Pengindeks atau Buat atau Perbarui Pengindeks atau metode yang setara dalam Azure SDK. Berikut adalah contoh definisi pengindeks.
{ "name": "myindexer", "description": null, "dataSourceName": "mydatasource", "targetIndexName": "myindex", "schedule": { }, "parameters": { }, "fieldMappings": [], "outputFieldMappings": [], "disabled": false, "encryptionKey": { } }
outputFieldMappings
Isi array untuk menentukan pemetaan. Pemetaan bidang terdiri dari tiga bagian."outputFieldMappings": [ { "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document", "targetFieldName": "some-search-field-in-an-index", "mappingFunction": null } ]
Properti Deskripsi sourceFieldName Harus diisi. Menentukan jalur ke konten yang diperkaya. Contohnya mungkin /document/content. Lihat Pengayaan referensi dalam kumpulan keterampilan Pencarian Azure AI untuk sintaks dan contoh jalur. targetFieldName Opsional. Menentukan bidang pencarian yang menerima konten yang diperkaya. Bidang target harus bidang atau koleksi sederhana tingkat atas. Ini tidak bisa menjadi jalur ke subbidang dalam jenis kompleks. Jika Anda ingin mengambil simpul tertentu dalam struktur yang kompleks, Anda dapat meratakan simpul individual dalam memori, lalu mengirim output ke koleksi string dalam indeks Anda. mappingFunction Opsional. Menambahkan pemrosesan tambahan yang disediakan oleh fungsi pemetaan yang didukung oleh pengindeks. Untuk simpul pengayaan, pengodean dan decoding adalah fungsi yang paling umum digunakan. targetFieldName
selalu nama bidang dalam indeks pencarian.sourceFieldName
adalah jalur ke simpul dalam dokumen yang diperkaya. Ini adalah output dari keterampilan. Jalur selalu dimulai dengan /document, dan jika Anda mengindeks dari blob, elemen kedua dari jalur adalah /content. Elemen ketiga adalah nilai yang dihasilkan oleh keterampilan. Untuk informasi dan contoh selengkapnya, lihat Pengayaan referensi dalam kumpulan keterampilan Pencarian Azure AI.Contoh ini menambahkan entitas dan label sentimen yang diekstrak dari properti konten blob ke bidang dalam indeks pencarian.
{ "name": "myIndexer", "dataSourceName": "myDataSource", "targetIndexName": "myIndex", "skillsetName": "myFirstSkillSet", "fieldMappings": [], "outputFieldMappings": [ { "sourceFieldName": "/document/content/organizations/*/description", "targetFieldName": "descriptions", "mappingFunction": { "name": "base64Decode" } }, { "sourceFieldName": "/document/content/organizations", "targetFieldName": "orgNames" }, { "sourceFieldName": "/document/content/sentiment", "targetFieldName": "sentiment" } ] }
Tetapkan fungsi pemetaan apa pun yang diperlukan untuk mengubah konten bidang sebelum disimpan dalam indeks. Untuk simpul pengayaan, pengodean dan decoding adalah fungsi yang paling umum digunakan.
Pemetaan bidang output satu ke banyak
Anda dapat menggunakan pemetaan bidang output untuk merutekan satu bidang sumber ke beberapa bidang dalam indeks pencarian. Anda mungkin melakukan ini untuk pengujian perbandingan atau jika Anda menginginkan bidang dengan atribut yang berbeda.
Asumsikan set keterampilan yang menghasilkan penyematan untuk bidang vektor, dan indeks yang memiliki beberapa bidang vektor yang bervariasi menurut pengaturan algoritma dan kompresi. Dalam pengindeks, petakan output keterampilan penyematan ke masing-masing dari beberapa bidang vektor dalam indeks pencarian.
"outputFieldMappings": [
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_hnsw" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_eknn" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_narrow" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_no_stored" },
{ "sourceFieldName" : "/document/content/text_vector", "targetFieldName" : "vector_scalar" }
]
Jalur bidang sumber adalah output keterampilan. Dalam contoh ini, outputnya text_vector. Nama target adalah properti opsional. Jika Anda tidak memberikan nama target pemetaan output, jalur akan disematkan atau lebih tepatnya, /document/content/embedding.
{
"name": "test-vector-size-ss",
"description": "Generate embeddings using AOAI",
"skills": [
{
"@odata.type": "#Microsoft.Skills.Text.AzureOpenAIEmbeddingSkill",
"name": "#1",
"description": null,
"context": "/document/content",
"resourceUri": "https://my-demo-eastus.openai.azure.com",
"apiKey": null,
"deploymentId": "text-embedding-ada-002",
"dimensions": 1536,
"modelName": "text-embedding-ada-002",
"inputs": [
{
"name": "text",
"source": "/document/content"
}
],
"outputs": [
{
"name": "embedding",
"targetName": "text_vector"
}
],
"authIdentity": null
}
]
}
Meratakan struktur kompleks ke dalam koleksi string
Jika data sumber Anda terdiri dari JSON berlapis atau hierarkis, Anda tidak dapat menggunakan pemetaan bidang untuk menyiapkan jalur data. Sebagai gantinya, indeks pencarian Anda harus mencerminkan struktur data sumber untuk di setiap tingkat untuk impor penuh.
Bagian ini memandu Anda melalui proses impor yang menghasilkan refleksi satu-ke-satu dari dokumen kompleks di sisi sumber dan target. Selanjutnya, ia menggunakan dokumen sumber yang sama untuk mengilustrasikan pengambilan dan meratakan simpul individual ke dalam koleksi string.
Berikut adalah contoh dokumen di Azure Cosmos DB dengan JSON berlapis:
{
"palette":"primary colors",
"colors":[
{
"name":"blue",
"medium":[
"acrylic",
"oil",
"pastel"
]
},
{
"name":"red",
"medium":[
"acrylic",
"pastel",
"watercolor"
]
},
{
"name":"yellow",
"medium":[
"acrylic",
"watercolor"
]
}
]
}
Jika Anda ingin mengindeks dokumen sumber ini sepenuhnya, Anda akan membuat definisi indeks tempat nama bidang, tingkat, dan jenis tercermin sebagai jenis kompleks. Karena pemetaan bidang tidak didukung untuk jenis kompleks dalam indeks pencarian, definisi indeks Anda harus mencerminkan dokumen sumber.
{
"name": "my-test-index",
"defaultScoringProfile": "",
"fields": [
{ "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
{ "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
{ "name": "colors", "type": "Collection(Edm.ComplexType)",
"fields": [
{
"name": "name",
"type": "Edm.String",
"searchable": true,
"retrievable": true
},
{
"name": "medium",
"type": "Collection(Edm.String)",
"searchable": true,
"retrievable": true,
}
]
}
]
}
Berikut adalah contoh definisi pengindeks yang menjalankan impor. Perhatikan bahwa tidak ada pemetaan bidang dan tidak ada set keterampilan.
{
"name": "my-test-indexer",
"dataSourceName": "my-test-ds",
"skillsetName": null,
"targetIndexName": "my-test-index",
"fieldMappings": [],
"outputFieldMappings": []
}
Hasilnya adalah contoh dokumen pencarian berikut, mirip dengan yang asli di Azure Cosmos DB.
{
"value": [
{
"@search.score": 1,
"id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"palette": "primary colors",
"colors": [
{
"name": "blue",
"medium": [
"acrylic",
"oil",
"pastel"
]
},
{
"name": "red",
"medium": [
"acrylic",
"pastel",
"watercolor"
]
},
{
"name": "yellow",
"medium": [
"acrylic",
"watercolor"
]
}
]
}
]
}
Penyajian alternatif dalam indeks pencarian adalah meratakan simpul individual dalam struktur berlapis sumber ke dalam kumpulan string dalam indeks pencarian.
Untuk menyelesaikan tugas ini, Anda memerlukan outputFieldMappings
yang memetakan simpul dalam memori ke koleksi string dalam indeks. Meskipun pemetaan bidang output terutama berlaku untuk output keterampilan, Anda juga dapat menggunakannya untuk mengatasi simpul setelah pemecahan dokumen di mana pengindeks membuka dokumen sumber dan membacanya ke dalam memori.
Contoh definisi indeks berikut menggunakan koleksi string untuk menerima output yang diratakan:
{
"name": "my-new-flattened-index",
"defaultScoringProfile": "",
"fields": [
{ "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
{ "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
{ "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
{ "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
]
}
Berikut adalah contoh definisi pengindeks, menggunakan outputFieldMappings
untuk mengaitkan JSON berlapis dengan bidang koleksi string. Perhatikan bahwa bidang sumber menggunakan sintaks jalur untuk simpul pengayaan, meskipun tidak ada set keterampilan. Dokumen yang diperkaya dibuat dalam sistem selama pemecahan dokumen, yang berarti Anda dapat mengakses simpul di setiap pohon dokumen selama simpul tersebut ada ketika dokumen retak.
{
"name": "my-test-indexer",
"dataSourceName": "my-test-ds",
"skillsetName": null,
"targetIndexName": "my-new-flattened-index",
"parameters": { },
"fieldMappings": [ ],
"outputFieldMappings": [
{
"sourceFieldName": "/document/colors/*/name",
"targetFieldName": "color_names"
},
{
"sourceFieldName": "/document/colors/*/medium",
"targetFieldName": "color_mediums"
}
]
}
Hasil dari definisi adalah sebagai berikut. Menyederhanakan struktur kehilangan konteks dalam kasus ini. Tidak ada lagi asosiasi antara warna tertentu dan media yang tersedia di dalamnya. Namun, tergantung pada skenario Anda, hasil yang mirip dengan contoh berikut mungkin persis apa yang Anda butuhkan.
{
"value": [
{
"@search.score": 1,
"id": "11bb11bb-cc22-dd33-ee44-55ff55ff55ff",
"palette": "primary colors",
"color_names": [
"blue",
"red",
"yellow"
],
"color_mediums": [
"[\"acrylic\",\"oil\",\"pastel\"]",
"[\"acrylic\",\"pastel\",\"watercolor\"]",
"[\"acrylic\",\"watercolor\"]"
]
}
]
}