Pencarian dan pola istilah parsial dengan karakter khusus (tanda hubung, kartubebas, regex, pola)

Pencarian istilah parsial mengacu pada kueri yang terdiri dari fragmen istilah, di mana alih-alih seluruh istilah, Anda mungkin hanya memiliki awal, tengah, atau akhir istilah (terkadang disebut sebagai kueri awalan, infiks, atau akhiran). Pencarian istilah parsial mungkin memasukkan kombinasi fragmen, seringkali dengan karakter khusus seperti tanda hubung, tanda pisah, atau garis miring yang merupakan bagian dari string kueri. Kasus penggunaan umum mencakup bagian dari nomor telepon, URL, kode, atau kata majemuk yang ditulis dengan tanda penghubung.

Istilah parsial dan karakter khusus bisa bermasalah jika indeks tidak memiliki token yang mewakili fragmen teks yang ingin Anda cari. Selama fase analisis leksikal pengindeksan (dengan asumsi penganalisis standar default), karakter khusus dibuang, kata majemuk dipisahkan, dan spasi kosong dihapus. Jika Anda mencari fragmen teks yang dimodifikasi selama analisis leksikal, kueri gagal karena tidak ada kecocokan yang ditemukan. Pertimbangkan contoh ini: nomor telepon seperti +1 (425) 703-6214 (ditokenisasi sebagai "1", , "703""425", "6214") tidak akan muncul dalam "3-62" kueri karena konten tersebut tidak benar-benar ada dalam indeks.

Solusinya adalah memanggil penganalisa selama pengindeksan yang mempertahankan string lengkap, termasuk spasi dan karakter khusus jika perlu, sehingga Anda dapat memasukkan spasi dan karakter dalam string kueri Anda. Memiliki string yang tidak disentuh secara keseluruhan memungkinkan pencocokan pola untuk kueri "dimulai dengan" atau "diakhiri dengan", di mana pola yang Anda berikan dapat dievaluasi terhadap istilah yang tidak diubah oleh analisis leksikal.

Jika Anda perlu mendukung skenario pencarian yang memanggil konten yang dianalisis dan tidak dianalisis, pertimbangkan untuk membuat dua bidang dalam indeks Anda, satu untuk setiap skenario. Satu bidang mengalami analisis leksikal. Bidang kedua menyimpan string utuh, menggunakan penganalisis yang mempertahankan konten yang memancarkan token seluruh string untuk pencocokan pola.

Pencarian Azure AI memindai seluruh istilah yang ditokenisasi dalam indeks dan tidak akan menemukan kecocokan pada istilah parsial kecuali Anda menyertakan operator tempat penampung kartubebas (* dan ?), atau memformat kueri sebagai ekspresi reguler.

Istilah parsial ditentukan menggunakan teknik ini:

  • Kueri ekspresi reguler dapat menjadi ekspresi reguler apa pun yang valid di bawah Apache Lucene.

  • Operator kartubebas dengan pencocokan awalan mengacu pada pola yang diakui secara umum yang mencakup awal istilah, diikuti oleh* atau ? mencukupi operator, seperti pencocokansearch=cap* pada "Cap'n Jack's Waterfront Inn" atau "Gacc Capital". Pencocokan awal didukung dalam sintaks kueri Lucene yang sederhana dan lengkap.

  • Kartubebas dengan infiks dan akhiran yang cocok menempatkan * dan?operator di dalam atau di awal istilah, dan memerlukan sintaks ekspresi reguler (di mana ekspresi dilampirkan dengan garis miring ke depan). Misalnya, string kueri (search=/.*numeric.*/) mengembalikan hasil pada "alphanumeric" dan "alphanumerical" sebagai pencocokan akhiran dan infiks.

Untuk ekspresi reguler, wildcard, dan pencarian fuzzy, penganalisis tidak digunakan pada waktu kueri. Untuk bentuk kueri ini, yang dideteksi oleh parser dengan kehadiran operator dan pembatas, string kueri diteruskan ke mesin tanpa analisis leksikal. Untuk bentuk kueri ini, penganalisa yang ditentukan pada bidang diabaikan.

Catatan

Saat string kueri parsial memasukkan karakter, seperti garis miring dalam fragmen URL, Anda mungkin perlu menambahkan karakter peluputan. Di JSON, garis miring / ke depan terluput dengan garis miring ke belakang \. Dengan demikian, search=/.*microsoft.com\/azure\/.*/ adalah sintaks untuk fragmen URL "microsoft.com/azure/".

Pemecahan masalah pencarian parsial/pola

Ketika Anda perlu mencari fragmen atau pola atau karakter khusus, Anda dapat ambil alih penganalisa default dengan penganalisa kustom yang beroperasi di bawah aturan tokenisasi yang lebih sederhana, mempertahankan seluruh string dalam indeks.

Pendekatannya terlihat seperti ini:

  1. Tentukan bidang kedua untuk menyimpan versi string yang utuh (dengan asumsi Anda ingin menganalisis dan teks yang tidak dianalisis pada waktu kueri)
  2. Mengevaluasi dan pilih di antara berbagai penganalis yang memancarkan token pada tingkat granularitas yang tepat
  3. Menetetapkan penganalisa ke bidang
  4. Membangun dan uji indeks

1 - Membuat bidang khusus

Penganalisa menentukan cara istilah tokenisasi dalam indeks. Karena penganalisa ditetapkan berdasarkan per bidang, Anda dapat membuat bidang dalam indeks untuk mengoptimalkan skenario yang berbeda. Misalnya, Anda dapat menentukan "featureCode" dan "featureCodeRegex" untuk mendukung pencarian teks lengkap reguler pada yang pertama, dan pencocokan pola lanjutan pada yang kedua. Penganalisa yang ditetapkan pada setiap bidang menentukan bagaimana konten setiap bidang diolah dalam indeks.

{
  "name": "featureCode",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": null
},
{
  "name": "featureCodeRegex",
  "type": "Edm.String",
  "retrievable": true,
  "searchable": true,
  "analyzer": "my_custom_analyzer"
},

2 - Mengatur penganalisa

Saat memilih penganalisa yang menghasilkan token seluruh istilah, penganalisa berikut adalah pilihan umum:

Penganalisis Perilaku
penganalisa bahasa Pertahankan tanda hubung dalam kata atau string majemuk, mutasi vokal, dan bentuk kata kerja. Jika pola kueri memasukkan tanda hubung, penggunaan penganalisa bahasa dapat mencukupi.
Kata Kunci Konten seluruh bidang diberi token sebagai satu istilah.
spasi kosong Pisahkan pada spasi putih saja. Istilah yang memasukkan tanda hubung atau karakter lain diperlakukan sebagai token tunggal.
penganalisa kustom (disarankan) Buat penganalisa khusus sehingga Anda dapat menentukan pembuat token dan filter token. Penganalisa sebelumnya harus digunakan apa adanya. Penganalisa khusus membuat Anda dapat memilih pembuat token dan filter token mana yang akan digunakan.

Kombinasi yang direkomendasikan adalahpembuat token katakunci dengan filter token huruf kecil. Dengan sendirinya, penganalisis kata kunci bawaan tidak menurunkan huruf besar teks apa pun, yang dapat menyebabkan kueri gagal. Penganalisa kustom memberi Anda mekanisme untuk menambahkan filter token huruf kecil.

Dengan menggunakan klien REST, Anda dapat menambahkan panggilan TEST Analyzer REST untuk memeriksa output yang ditokenisasi.

Indeks harus ada di layanan pencarian, tetapi bisa kosong. Mengingat indeks yang ada dan bidang yang berisi tanda hubung atau istilah parsial, Anda dapat mencoba berbagai penganalisa melalui istilah tertentu untuk melihat token apa yang dipancarkan.

  1. Pertama, periksa penganalisa Standar untuk melihat bagaimana istilah diberi token secara default.

    {
    "text": "SVP10-NOR-00",
    "analyzer": "standard"
    }
    
  2. Evaluasi respons untuk melihat bagaimana teks diberi token dalam indeks. Perhatikan bagaimana setiap istilah berhuruf kecil, tanda hubung dihapus, dan substring dipecah menjadi token individual. Hanya kueri yang cocok pada token ini yang akan mengembalikan dokumen ini dalam hasil. Kueri yang memasukkan "10-NOR" akan gagal.

    {
        "tokens": [
            {
                "token": "svp10",
                "startOffset": 0,
                "endOffset": 5,
                "position": 0
            },
            {
                "token": "nor",
                "startOffset": 6,
                "endOffset": 9,
                "position": 1
            },
            {
                "token": "00",
                "startOffset": 10,
                "endOffset": 12,
                "position": 2
            }
        ]
    }
    
  3. Sekarang ubah permintaan untuk menggunakan penganalisa whitespaceataukeyword:

    {
    "text": "SVP10-NOR-00",
    "analyzer": "keyword"
    }
    
  4. Kali ini, respons terdiri dari satu token, huruf besar, dengan tanda hubung yang dipertahankan sebagai bagian dari string. Jika Anda perlu mencari pola atau istilah parsial seperti "10-NOR", mesin kueri sekarang memiliki dasar untuk menemukan kecocokan.

    {
    
        "tokens": [
            {
                "token": "SVP10-NOR-00",
                "startOffset": 0,
                "endOffset": 12,
                "position": 0
            }
        ]
    }
    

Penting

Ketahuilah bahwa pengurai kueri sering kali istilah huruf kecil dalam ekspresi pencarian saat membangun pohon kueri. Jika Anda menggunakan penganalisa yang tidak berupa input teks huruf kecil selama pengindeksan, dan Anda tidak memperoleh hasil yang diharapkan, ini bisa menjadi alasannya. Solusinya adalah menambahkan filter token huruf kecil, seperti yang dijelaskan di bagian "Gunakan penganalisa kustom" di bawah ini.

3 - Mengonfigurasikan penganalisa

Baik Anda mengevaluasi penganalisis atau bergerak maju dengan konfigurasi tertentu, Anda harus menentukan penganalisis pada definisi bidang, dan mungkin mengonfigurasi penganalisis itu sendiri jika Anda tidak menggunakan penganalisis bawaan. Saat bertukar penganalisa, Anda biasanya perlu membangun ulang indeks (hilangkan, buat-ulang, dan muat-ulang).

Menggunakan penganalisa bawaan

Penganalisis bawaan dapat ditentukan berdasarkan nama pada analyzer properti definisi bidang, tanpa konfigurasi tambahan yang diperlukan dalam indeks. Contoh berikut menunjukkan bagaimana Anda akan mengaturwhitespace penganalisa di bidang.

Untuk skenario lain dan untuk mempelajari selengkapnya tentang penganalisa bawaan lainnya, lihat Penganalisa bawaan.

    {
      "name": "phoneNumber",
      "type": "Edm.String",
      "key": false,
      "retrievable": true,
      "searchable": true,
      "analyzer": "whitespace"
    }

Menggunakan penganalisa kustom

Jika Anda menggunakan penganalisis kustom, tentukan dalam indeks dengan kombinasi tokenizer, filter token yang ditentukan pengguna, dengan kemungkinan pengaturan konfigurasi. Selanjutnya, referensikan pada definisi bidang, sama seperti Anda akan menjadi penganalisa bawaan.

Ketika tujuannya adalah tokenisasi seluruh istilah, penganalisa kustom yang terdiri dari pembuat token katakunci dan filter token huruf kecil disarankan.

  • Pembuat token kata kunci membuat token tunggal untuk seluruh konten bidang.
  • Filter token huruf kecil mengubah huruf besar menjadi teks huruf kecil. Pengurai kueri biasanya berupa huruf kecil input teks huruf besar apa pun. Huruf kecil menghomogenkan input dengan istilah yang diberi token.

Contoh berikut mengilustrasikan penganalisa kustom yang menyediakan pembuat token kata kunci dan filter token huruf kecil.

{
"fields": [
  {
  "name": "accountNumber",
  "analyzer":"myCustomAnalyzer",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": false,
  "facetable": false
  }
],

"analyzers": [
  {
  "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
  "name":"myCustomAnalyzer",
  "charFilters":[],
  "tokenizer":"keyword_v2",
  "tokenFilters":["lowercase"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": []
}

Catatan

keyword_v2 Pembuat token lowercase dan filter token diketahui oleh sistem dan menggunakan konfigurasi default mereka, itulah sebabnya Anda dapat mereferensikan dengan nama tanpa harus mendefinisikannya terlebih dahulu.

4 - Membangun dan uji

Setelah Anda menentukan indeks dengan penganalisis dan definisi bidang yang mendukung skenario Anda, muat dokumen yang memiliki string representatif sehingga Anda dapat menguji kueri string parsial.

Gunakan klien REST untuk mengkueri istilah parsial dan karakter khusus yang dijelaskan dalam artikel ini.

Bagian sebelumnya menjelaskan logika. Bagian ini melangkah melalui setiap API yang harus Anda panggil saat menguji solusi Anda.

  • Hapus indeks menghapus indeks yang ada dengan nama yang sama sehingga Anda dapat membuatnya kembali.

  • Buat Indeks membuat struktur indeks pada layanan pencarian Anda, termasuk definisi penganalisa dan bidang dengan spesifikasi penganalisa.

  • Muat Dokumen mengimpor dokumen yang memiliki struktur yang sama dengan indeks Anda, serta konten yang dapat dicari. Setelah langkah ini, indeks Anda siap untuk membuat kueri atau pengujian.

  • Test Analyzerdiperkenalkan di Set penganalisa . Uji beberapa string dalam indeks Anda menggunakan berbagai penganalisis untuk memahami bagaimana istilah ditokenisasi.

  • Dokumen Pencarian menjelaskan cara membuat permintaan kueri, menggunakan sintaks sederhana atau sintaks Lucene penuh untuk kartubebas dan ekspresi reguler.

    Untuk kueri istilah parsial, seperti meminta "3-6214" untuk menemukan kecocokan pada "+1 (425) 703-6214", Anda dapat menggunakan sintaks sederhana:search=3-6214&queryType=simple.

    Untuk kueri infiks dan akhiran, seperti meminta "num" atau "numerik untuk menemukan kecocokan pada "alphanumerik", gunakan sintaks Lucene lengkap dan ekspresi reguler: search=/.*num.*/&queryType=full

Menyesuaikan performa kueri

Jika Anda menerapkan konfigurasi yang direkomendasikan yang menyertakan tokenizer keyword_v2 dan filter token huruf kecil, Anda mungkin melihat penurunan performa kueri karena pemrosesan filter token tambahan atas token yang ada di indeks Anda.

Contoh berikut menambahkan EdgeNGramTokenFilter untuk membuat awalan cocok dengan lebih cepat. Token dihasilkan dalam kombinasi 2-25 karakter yang menyertakan karakter. Berikut adalah contoh perkembangan dari dua hingga tujuh token: MS, MSF, MSFT, MSFT/, MSFT/S, MSFT/SQ, MSFT/SQL.

Tokenisasi tambahan menghasilkan indeks yang lebih besar. Jika Anda memiliki kapasitas yang cukup untuk mengakomodasi indeks yang lebih besar, pendekatan ini dengan waktu respons yang lebih cepat mungkin menjadi solusi terbaik.

{
"fields": [
  {
  "name": "accountNumber",
  "analyzer":"myCustomAnalyzer",
  "type": "Edm.String",
  "searchable": true,
  "filterable": true,
  "retrievable": true,
  "sortable": false,
  "facetable": false
  }
],

"analyzers": [
  {
  "@odata.type":"#Microsoft.Azure.Search.CustomAnalyzer",
  "name":"myCustomAnalyzer",
  "charFilters":[],
  "tokenizer":"keyword_v2",
  "tokenFilters":["lowercase", "my_edgeNGram"]
  }
],
"tokenizers":[],
"charFilters": [],
"tokenFilters": [
  {
  "@odata.type":"#Microsoft.Azure.Search.EdgeNGramTokenFilterV2",
  "name":"my_edgeNGram",
  "minGram": 2,
  "maxGram": 25,
  "side": "front"
  }
]
}

Langkah berikutnya

Artikel ini menjelaskan bagaimana penganalisa berkontribusi pada masalah kueri dan memecahkan masalah kueri. Sebagai langkah berikutnya, lihat lebih dekat penganalisis memengaruhi pengindeksan dan pemrosesan kueri.