Memfilter penelusuran kustom untuk data terstruktur atau tidak terstruktur

Jika Anda memiliki aplikasi penelusuran yang menggunakan data terstruktur, atau data tidak terstruktur dengan metadata, Anda dapat menggunakan metadata untuk memfilter kueri penelusuran. Halaman ini menjelaskan cara menggunakan kolom metadata untuk membatasi penelusuran Anda ke sekumpulan dokumen tertentu.

Sebelum memulai

Pastikan Anda telah membuat aplikasi dan menyerap data terstruktur, atau data tidak terstruktur dengan metadata. Untuk mengetahui informasi selengkapnya, lihat Membuat aplikasi penelusuran.

Contoh metadata

Tinjau contoh metadata untuk empat file PDF ini (document_1.pdf, document_2.pdf, document_3.pdf, dan document_4.pdf). Metadata ini akan berada dalam file JSON di bucket Cloud Storage, bersama dengan file PDF. Anda dapat merujuk kembali ke contoh ini saat membaca halaman ini.

{"id": "1", "structData": {"title": "Policy on accepting corrected claims", "category": ["persona_A"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_1.pdf"}}
{"id": "2", "structData": {"title": "Claims documentation and reporting guidelines for commercial members", "category": ["persona_A", "persona_B"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_2.pdf"}}
{"id": "3", "structData": {"title": "Claims guidelines for bundled services and supplies for commercial members", "category": ["persona_B", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_3.pdf"}}
{"id": "4", "structData": {"title": "Advantage claims submission guidelines", "category": ["persona_A", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_4.pdf"}}

Sintaksis ekspresi filter

Pastikan Anda memahami sintaksis ekspresi filter yang akan digunakan untuk menentukan filter penelusuran. Sintaks ekspresi filter dapat diringkas oleh Extended Backus–Naur form berikut:

  # A single expression or multiple expressions that are joined by "AND" or "OR".
  filter = expression, { " AND " | "OR", expression };
  # Expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
    # A parenthetical expression.
    | "(", expression, ")"
    # A simple expression applying to a text field.
    # Function "ANY" returns true if the field exactly matches any of the literals.
    ( text_field, ":", "ANY", "(", literal, { ",", literal }, ")"
    # A simple expression applying to a numerical field. Function "IN" returns true
    # if a field value is within the range. By default, lower_bound is inclusive and
    # upper_bound is exclusive.
    | numerical_field, ":", "IN", "(", lower_bound, ",", upper_bound, ")"
    # A simple expression that applies to a numerical field and compares with a double value.
    | numerical_field, comparison, double
    # An expression that applies to a geolocation field with text/street/postal address.
    |  geolocation_field, ":", "GEO_DISTANCE(", literal, ",", distance_in_meters, ")"
    # An expression that applies to a geolocation field with latitude and longitude.
    | geolocation_field, ":", "GEO_DISTANCE(", latitude_double, ",", longitude_double, ",", distance_in_meters, ")"
    # Datetime field
    | datetime_field, comparison, literal_iso_8601_datetime_format);
  # A lower_bound is either a double or "*", which represents negative infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";
  # An upper_bound is either a double or "*", which represents infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  upper_bound = ( double, [ "e" | "i" ] ) | "*";
  # Supported comparison operators.
  comparison = "<=" | "<" | ">=" | ">" | "=";
  # A literal is any double quoted string. You must escape backslash (\) and
  # quote (") characters.
  literal = double quoted string;
  text_field = text field - for example, category;
  numerical_field = numerical field - for example, score;
  geolocation_field = field of geolocation data type - for example home_address, location;
  datetime_field = field of datetime data type - for example creation_date, expires_on;
  literal_iso_8601_datetime_format = either a double quoted string representing ISO 8601 datetime or a numerical field representing microseconds from unix epoch.

Menelusuri menggunakan filter metadata

Untuk menelusuri menggunakan filter metadata, ikuti langkah-langkah berikut:

  1. Tentukan kolom metadata yang akan digunakan untuk memfilter kueri penelusuran Anda.

    Misalnya, untuk metadata di Sebelum Anda memulai, Anda dapat menggunakan kolom category sebagai filter penelusuran. Saat memfilter data terstruktur, seperti dalam contoh metadata, tentukan jalur lengkap ke kolom: structData.category. Kemudian, pengguna Anda dapat memfilter persona_A, persona_B, atau persona_C, sehingga penelusuran mereka dibatasi pada dokumen yang terkait dengan persona yang mereka minati.

  2. Membuat kolom metadata dapat diindeks:

    1. Di konsol Google Cloud , buka halaman AI Applications dan di menu navigasi, klik Apps.

      Buka halaman Aplikasi

    2. Klik aplikasi penelusuran Anda.

    3. Di menu navigasi, klik Data.

    4. Klik tab Schema. Tab ini menampilkan setelan kolom saat ini.

    5. Klik Edit.

    6. Centang kotak Dapat diindeks untuk kolom yang ingin Anda buat agar dapat diindeks.

    7. Klik Simpan. Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi setelan kolom.

  3. Temukan ID penyimpanan data Anda. Jika Anda sudah memiliki ID penyimpanan data, lanjutkan ke langkah berikutnya.

    1. Di konsol Google Cloud , buka halaman AI Applications dan di menu navigasi, klik Data Stores.

      Buka halaman Data Stores

    2. Klik nama penyimpanan data Anda.

    3. Di halaman Data untuk penyimpanan data Anda, dapatkan ID penyimpanan data.

  4. Mendapatkan hasil penelusuran.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "filter": "FILTER"
    }'
    

    Ganti kode berikut:

    • PROJECT_ID: ID project Anda.
    • DATA_STORE_ID: ID penyimpanan data Anda.
    • QUERY: teks kueri yang akan ditelusuri.
    • FILTER: optional. Kolom teks yang memungkinkan Anda memfilter sekumpulan kolom tertentu, menggunakan sintaksis ekspresi filter. Nilai defaultnya adalah string kosong, yang berarti tidak ada filter yang diterapkan.

    Misalnya, Anda mengimpor empat file PDF dengan metadata dari Sebelum memulai. Anda ingin menelusuri dokumen yang berisi kata "klaim", dan hanya mengkueri dokumen dengan nilai category sebesar persona_A. Anda dapat melakukannya dengan menyertakan pernyataan berikut dalam panggilan Anda:

    "query": "claims",
    "filter": "structData.category: ANY(\"persona_A\")"
    

    Untuk mengetahui informasi selengkapnya, lihat tab REST di Mendapatkan hasil penelusuran untuk aplikasi dengan data terstruktur atau tidak terstruktur.

    Klik untuk melihat contoh respons.

    Jika Anda melakukan penelusuran seperti yang ada dalam prosedur sebelumnya, Anda dapat mengharapkan respons yang serupa dengan berikut ini. Perhatikan bahwa respons mencakup tiga dokumen yang memiliki nilai category sebesar persona_A.

    {
    "results": [
    {
      "id": "2",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/2",
        "id": "2",
        "structData": {
          "title": "Claims documentation and reporting guidelines for commercial members",
          "category": [
            "persona_A",
            "persona_B"
          ]
        },
        "derivedStructData": {
          "link": "gs://bucketname_87654321/data/document_2.pdf",
          "extractive_answers": [
            {
              "pageNumber": "1",
              "content": "lorem ipsum"
            }
          ]
        }
      }
    },
    {
      "id": "1",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/1",
        "id": "1",
        "structData": {
          "title": "Policy on accepting corrected claims",
          "category": [
            "persona_A"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "2",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_1.pdf"
        }
      }
    },
    {
      "id": "4",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/4",
        "id": "4",
        "structData": {
          "title": "Advantage claims submission guidelines",
          "category": [
            "persona_A",
            "persona_C"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "47",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_4.pdf"
        }
      }
    }
    ],
    "totalSize": 330,
    "attributionToken": "UvBRCgsI26PxpQYQs7vQZRIkNjRiYWY1MTItMDAwMC0yZWIwLTg3MTAtMTQyMjNiYzYzMWEyIgdHRU5FUklDKhSOvp0VpovvF8XL8xfC8J4V1LKdFQ",
    "guidedSearchResult": {},
    "summary": {}
    }
    

Contoh ekspresi filter

Tabel berikut memberikan contoh ekspresi filter.

Filter Hanya menampilkan hasil untuk dokumen yang:
category: ANY("persona_A") kolom teks category adalah persona_A
score: IN(*, 100.0e) kolom numerik score lebih besar dari negatif tak terhingga dan kurang dari 100,0
non-smoking = "true" boolean non-smoking bernilai benar
pet-friendly = "false" boolean pet-friendly adalah salah (false)
manufactured_date = "2023" manufactured date adalah kapan saja pada tahun 2023
manufactured_date >= "2024-04-16" manufactured_date adalah pada atau setelah 16 April 2024
manufactured_date < "2024-04-16T12:00:00-07:00" manufactured_date terjadi sebelum pukul 12.00 Waktu Musim Panas Pasifik pada 16 April 2024
office.location:GEO_DISTANCE("1600 Amphitheater Pkwy, Mountain View, CA, 94043", 500) kolom geolokasi office.location berada dalam jarak 500 m dari 1600 Amphitheater Pkwy
NOT office.location:GEO_DISTANCE("Palo Alto, CA", 1000) kolom geolokasi office.location tidak berada dalam radius 1 km dari Palo Alto, California.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) kolom geolokasi office.location berada dalam radius 500 m dari lintang 34,1829 dan bujur -121,293
category: ANY("persona_A") AND score: IN(*, 100.0e) category adalah persona_A dan score kurang dari 100
office.location:GEO_DISTANCE("Mountain View, CA", 500) OR office.location:GEO_DISTANCE("Palo Alto, CA", 500) office.location berada dalam jarak 500 m dari Mountain View atau Palo Alto.
(price<175 AND pet-friendly = "true") OR (price<125 AND pet-friendly = "false") price kurang dari 175 dan saya dapat membawa hewan peliharaan, atau price kurang dari 125 dan saya tidak dapat membawa hewan peliharaan

Langkah berikutnya

  • Untuk memahami dampak filter terhadap kualitas penelusuran, evaluasi kualitas penelusuran. Untuk mengetahui informasi selengkapnya, lihat Mengevaluasi kualitas penelusuran.