Contoh sintaks pencarian Lucene "penuh" (kueri tingkat lanjut di Azure AI Search)

Saat membuat kueri untuk Azure AI Search, Anda dapat mengganti pengurai kueri sederhana default dengan pengurai kueri Lucene yang lebih kuat untuk merumuskan ekspresi kueri khusus dan tingkat lanjut.

Pengurai Lucene mendukung format kueri yang kompleks, seperti kueri tercakup bidang, pencarian fuzzy, pencarian kartubebas infiks dan akhiran, pencarian kedekatan, peningkatan istilah, dan pencarian ekspresi reguler. Kekuatan tambahan dilengkapi dengan lebih banyak persyaratan pemrosesan sehingga Anda harus mengharapkan waktu eksekusi yang sedikit lebih lama. Dalam artikel ini, Anda dapat menelusuri contoh yang menunjukkan operasi kueri berdasarkan sintaks penuh.

Catatan

Banyak konstruksi kueri khusus yang diaktifkan melalui sintaks kueri Lucene penuh tidak dianalisis teks, yang dapat mengejutkan jika Anda mengharapkan stemming atau lemmatisasi. Analisis leksikal hanya dilakukan pada istilah lengkap (kueri istilah atau kueri frasa). Jenis kueri dengan istilah yang tidak lengkap (kueri awalan, kueri kartubebas, kueri regex, kueri fuzzy) ditambahkan langsung ke pohon kueri, melewati tahap analisis. Satu-satunya transformasi yang dilakukan pada istilah kueri dari jenis tersebut adalah huruf kecil.

Indeks sampel hotel

Kueri berikut didasarkan pada indeks sampel hotel, yang dapat Anda buat dengan mengikuti instruksi dalam mulai cepat ini.

Contoh kueri diartikulasikan menggunakan permintaan REST API dan POST. Anda dapat menempelkan dan menjalankannya di klien REST. Atau, gunakan tampilan JSON Search Explorer di portal Azure. Dalam tampilan JSON, Anda bisa menempelkan contoh kueri yang diperlihatkan di sini dalam artikel ini.

Permintaan header harus memiliki nilai berikut:

Tombol Nilai
Content-Type application/json
api-key <your-search-service-api-key>, baik kueri atau kunci admin

Parameter URI harus menyertakan titik akhir layanan pencarian Anda dengan nama indeks, koleksi dokumen, perintah pencarian, dan versi API, mirip dengan contoh berikut:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2023-11-01

Isi permintaan harus dibentuk sebagai JSON yang valid:

{
    "search": "*",
    "queryType": "full",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • "pencarian" yang diatur ke * adalah kueri yang tidak ditentukan, setara dengan pencarian null atau kosong. Ini tidak terlalu berguna, tetapi ini adalah pencarian paling sederhana yang dapat Anda lakukan, dan menunjukkan semua bidang yang dapat diambil dalam indeks, dengan semua nilai.

  • "queryType" yang diatur ke "full" memanggil pengurai kueri Lucene penuh dan diperlukan untuk sintaks ini.

  • "pilih" yang diatur ke daftar bidang yang dipisahkan koma digunakan untuk komposisi hasil pencarian, termasuk hanya bidang yang berguna dalam konteks hasil pencarian.

  • "hitung" mengembalikan jumlah dokumen yang cocok dengan kriteria pencarian. Pada string pencarian kosong, jumlahnya adalah semua dokumen dalam indeks (50 di indeks sampel hotel).

Individual cakupan pencarian berbidang, ekspresi pencarian yang disematkan ke bidang tertentu. Contoh ini mencari nama hotel dengan istilah "hotel" di dalamnya, tetapi bukan "motel". Anda dapat menentukan beberapa bidang menggunakan AND.

Saat Anda menggunakan sintaks kueri ini, Anda dapat menghilangkan searchFields parameter saat bidang yang ingin Anda kueri berada dalam ekspresi pencarian itu sendiri. Jika Anda menyertakan searchFields dengan pencarian bidang, fieldName:searchExpression selalu diutamakan daripada searchFields.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:(hotel NOT motel) AND Category:'Resort and Spa'",
    "queryType": "full",
    "select": "HotelName, Category",
    "count": true
}

Respons untuk kueri ini akan terlihat mirip dengan contoh berikut, difilter pada "Resort and Spa", mengembalikan hotel yang menyertakan "hotel" dalam nama, sambil mengecualikan hasil yang menyertakan "motel" dalam nama.

"@odata.count": 4,
"value": [
    {
        "@search.score": 4.481559,
        "HotelName": "Nova Hotel & Spa",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.4524608,
        "HotelName": "King's Palace Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.3970203,
        "HotelName": "Triple Landscape Hotel",
        "Category": "Resort and Spa"
    },
    {
        "@search.score": 2.2953436,
        "HotelName": "Peaceful Market Hotel & Spa",
        "Category": "Resort and Spa"
    }
]

Ekspresi pencarian dapat berupa istilah tunggal atau frasa, atau ekspresi yang lebih kompleks dalam tanda kurung, secara opsional dengan operator Boolean. Beberapa contoh meliputi:

  • HotelName:(hotel NOT motel)
  • Address/StateProvince:("WA" OR "CA")
  • Tags:("free wifi" NOT "free parking") AND "coffee in lobby"

Pastikan untuk meletakkan frasa dalam tanda kutip jika Anda ingin kedua string dievaluasi sebagai entitas tunggal, seperti dalam hal mencari dua lokasi berbeda di bidang Alamat/Provinsi Negara. Tergantung pada klien, Anda mungkin perlu meloloskan (\) tanda kutip.

Bidang yang ditentukan dalam fieldName:searchExpression harus merupakan bidang yang dapat dicari. Lihat Buat Indeks (REST API) untuk detail tentang bagaimana definisi bidang dikaitkan.

Pencarian fuzzy mencocokkan dengan istilah yang serupa, termasuk kata-kata yang salah eja. Untuk melakukan pencarian fuzzy, tambahkan simbol tilde ~ di akhir satu kata dengan parameter opsional, nilai antara 0 dan 2, yang menentukan jarak edit. Misalnya, blue~ atau blue~1 akan mengembalikan warna biru, blues, dan lem.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Tags:conserge~",
    "queryType": "full",
    "select": "HotelName, Category, Tags",
    "searchFields": "HotelName, Category, Tags",
    "count": true
}

Respons untuk kueri ini memutuskan untuk "concierge" dalam dokumen yang cocok, dipangkas untuk brevity:

"@odata.count": 12,
"value": [
    {
        "@search.score": 1.1832147,
        "HotelName": "Secret Point Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "air conditioning",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1819803,
        "HotelName": "Twin Dome Motel",
        "Category": "Boutique",
        "Tags": [
            "pool",
            "free wifi",
            "concierge"
        ]
    },
    {
        "@search.score": 1.1773309,
        "HotelName": "Smile Hotel",
        "Category": "Suite",
        "Tags": [
            "view",
            "concierge",
            "laundry service"
        ]
    },

Frasa tidak didukung secara langsung tetapi Anda dapat menentukan kecocokan fuzzy pada setiap istilah frasa multi-bagian, seperti search=Tags:landy~ AND sevic~. Ekspresi kueri ini menemukan 15 kecocokan pada "layanan binatu".

Catatan

Kueri fuzzy tidak dianalisis. Jenis kueri dengan istilah yang tidak lengkap (kueri awalan, kueri kartubebas, kueri regex, kueri fuzzy) ditambahkan langsung ke pohon kueri, melewati tahap analisis. Satu-satunya transformasi yang dilakukan pada istilah kueri dari jenis tersebut adalah huruf kecil.

Pencarian terdekat menemukan istilah yang saling berdekatan dalam sebuah dokumen. Sisipkan simbol tilde "~" di akhir frasa diikuti dengan jumlah kata yang membuat batas kedekatan.

Kueri ini mencari istilah "hotel" dan "bandara" dalam 5 kata satu sama lain dalam dokumen. Tanda kutip lolos (\") untuk mempertahankan frasa:

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "Description: \"hotel airport\"~5",
    "queryType": "full",
    "select": "HotelName, Description",
    "searchFields": "HotelName, Description",
    "count": true
}

Respons untuk kueri akan terlihat mirip dengan contoh berikut:

"@odata.count": 2,
"value": [
    {
        "@search.score": 0.6331726,
        "HotelName": "Trails End Motel",
        "Description": "Only 8 miles from Downtown.  On-site bar/restaurant, Free hot breakfast buffet, Free wireless internet, All non-smoking hotel. Only 15 miles from airport."
    },
    {
        "@search.score": 0.43032226,
        "HotelName": "Catfish Creek Fishing Cabins",
        "Description": "Brand new mattresses and pillows.  Free airport shuttle. Great hotel for your business needs. Comp WIFI, atrium lounge & restaurant, 1 mile from light rail."
    }
]

Contoh 4: Peningkatan istilah

Peningkatan istilah mengacu pada peringkat dokumen yang lebih tinggi jika berisi istilah yang didorong, relatif terhadap dokumen yang tidak berisi istilah. Untuk meningkatkan istilah, gunakan tanda sisipan, ^simbol , dengan faktor peningkatan (angka) di akhir istilah yang Anda cari. Default faktor dorongan adalah 1, dan meskipun harus positif, itu bisa kurang dari 1 (misalnya, 0,2). Dokumen ini berbeda dari penilaian profil dalam profil penilaian yang meningkatkan bidang tertentu, bukan istilah tertentu.

Dalam kueri "sebelum", cari "akses pantai" dan perhatikan bahwa ada tujuh dokumen yang cocok dengan satu atau kedua istilah.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "beach access",
    "queryType": "full",
    "select": "HotelName, Description, Tags",
    "searchFields": "HotelName, Description, Tags",
    "count": true
}

Bahkan, hanya ada satu dokumen yang cocok pada "akses", dan karena itu satu-satunya kecocokan, penempatannya tinggi (posisi kedua) meskipun dokumen kehilangan istilah "pantai".

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.2723424,
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown."
    },
    {
        "@search.score": 1.5507699,
        "HotelName": "Old Carrabelle Hotel",
        "Description": "Spacious rooms, glamorous suites and residences, rooftop pool, walking access to shopping, dining, entertainment and the city center."
    },
    {
        "@search.score": 1.5358944,
        "HotelName": "Whitefish Lodge & Suites",
        "Description": "Located on in the heart of the forest. Enjoy Warm Weather, Beach Club Services, Natural Hot Springs, Airport Shuttle."
    },
    {
        "@search.score": 1.3433652,
        "HotelName": "Ocean Air Motel",
        "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away."
    },

Dalam kueri "setelah", ulangi pencarian, kali ini meningkatkan hasil dengan istilah "pantai" dibanding istilah "akses". Versi kueri yang dapat dibaca manusia adalah search=Description:beach^2 access. Tergantung pada klien Anda, Anda mungkin harus mengekspresikan ^2 sebagai %5E2.

Setelah meningkatkan istilah "pantai", kecocokan di Old Carrabelle Hotel bergerak turun ke posisi keenam.

Contoh 5: Regex

Pencarian ekspresi reguler menemukan kecocokan berdasarkan konten antara garis miring "/", seperti yang didokumentasikan di kelas RegExp.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:/(Mo|Ho)tel/",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Respons untuk kueri akan terlihat mirip dengan contoh berikut:

    "@odata.count": 22,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Days Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Triple Landscape Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Smile Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Pelham Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Sublime Cliff Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Twin Dome Motel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Nova Hotel & Spa"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },

Catatan

Kueri regex tidak dianalisis. Satu-satunya transformasi yang dilakukan pada istilah kueri dari jenis tersebut adalah huruf kecil.

Anda dapat menggunakan sintaksis yang dikenali secara umum untuk beberapa (*) atau satu pencarian kartubebas karakter (?). Perhatikan pengurai kueri Lucene mendukung penggunaan simbol ini dengan satu istilah, bukan frasa.

Dalam kueri ini, cari nama hotel yang berisi awalan 'sc'. Anda tidak dapat menggunakan * simbol atau ? sebagai karakter pertama pencarian.

POST /indexes/hotel-samples-index/docs/search?api-version=2023-11-01
{
    "search": "HotelName:sc*",
    "queryType": "full",
    "select": "HotelName",
    "count": true
}

Respons untuk kueri akan terlihat mirip dengan contoh berikut:

    "@odata.count": 2,
    "value": [
        {
            "@search.score": 1.0,
            "HotelName": "Scarlet Harbor Hotel"
        },
        {
            "@search.score": 1.0,
            "HotelName": "Scottish Inn"
        }
    ]

Catatan

Kueri regex tidak dianalisis. Satu-satunya transformasi yang dilakukan pada istilah kueri dari jenis tersebut adalah huruf kecil.

Langkah berikutnya

Coba tentukan kueri dalam kode. Tautan berikut mencakup cara menyiapkan kueri pencarian menggunakan Azure SDK.

Referensi sintaks lainnya, arsitektur kueri, dan contoh dapat ditemukan di tautan berikut: