Memetakan output yang diperkaya ke bidang dalam indeks pencarian di Azure AI Search

Tahap Pengindeks

Artikel ini menjelaskan cara menyiapkan pemetaan bidang output, menentukan jalur data antara struktur data dalam memori yang dibuat selama pemrosesan set keterampilan, dan bidang target dalam indeks pencarian. 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 dua struktur data fisik, definisi outputFieldMappings memetakan pengayaan dalam memori ke bidang dalam indeks pencarian.

Pemetaan bidang output diperlukan jika pengindeks Anda memiliki set keterampilan terlampir yang membuat informasi baru, seperti terjemahan teks atau ekstraksi frasa kunci. Selama eksekusi pengindeks, informasi yang dihasilkan AI hanya ada dalam memori. Untuk mempertahankan informasi ini dalam indeks pencarian, Anda harus memberi tahu pengindeks tempat mengirim data.

Pemetaan bidang output juga dapat digunakan untuk mengambil simpul tertentu dalam jenis kompleks dokumen sumber. Misalnya, Anda mungkin hanya ingin "FullName/LastName" di properti "FullName" multi-bagian. Ketika Anda tidak memerlukan struktur kompleks penuh, Anda dapat meratakan simpul individual dalam struktur data berlapis, lalu menggunakan pemetaan bidang output untuk mengirim output ke koleksi string dalam indeks pencarian Anda.

Pemetaan bidang output berlaku untuk:

  • Konten dalam memori yang dibuat oleh keterampilan atau diekstrak oleh pengindeks. Bidang sumber adalah simpul dalam pohon dokumen yang diperkaya.

  • Indeks pencarian. Jika Anda mengisi penyimpanan pengetahuan, gunakan proyeksi untuk konfigurasi jalur data. Jika Anda mengisi bidang vektor, pemetaan bidang output tidak digunakan.

Pemetaan bidang output diterapkan setelah eksekusi set keterampilan atau setelah pemecahan dokumen jika tidak ada set keterampilan terkait.

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.

"fieldMappings": []
"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.

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 definisi yang dirender.

Gunakan Buat Pengindeks (REST) atau Pengindeks Pembaruan (REST), versi API apa pun.

Contoh ini menambahkan entitas dan label sentimen yang diekstrak dari properti konten blob ke bidang dalam indeks pencarian.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "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"
        }
    ]
}

Untuk setiap pemetaan bidang output, atur lokasi data dalam pohon dokumen yang diperkaya (sourceFieldName), dan nama bidang sebagaimana direferensikan dalam indeks (targetFieldName). Tetapkan fungsi pemetaan apa pun yang diperlukan untuk mengubah konten bidang sebelum disimpan dalam indeks.

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 sepenuhnya mengindeks dokumen sumber di atas, Anda akan membuat definisi indeks di mana 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 tidak ada pemetaan bidang dan tanpa 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": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "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.

Di bawah ini adalah contoh definisi indeks, 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 di atas 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 yang ditunjukkan di bawah ini mungkin persis apa yang Anda butuhkan.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}

Lihat juga