Elasticsearch: Perbedaan antara "Term", "Match Phrase", dan "Query String"

116

Baru di sini di Elasticsearch dan mencoba untuk mendapatkan pemahaman yang lebih baik tentang perbedaan antara kueri ini. Sejauh yang saya tahu, termcocok dengan satu istilah (harus menggunakan huruf kecil agar cocok?), Dan keduanya match phrasedan query stringcocok dengan string teks.

blee908
sumber

Jawaban:

226

termkueri cocok dengan satu istilah sebagaimana adanya: nilai tidak dianalisis . Jadi, tidak harus dalam huruf kecil tergantung pada apa yang telah Anda indeks.

Jika Anda memberikan Bennettpada waktu indeks dan nilainya tidak dianalisis, kueri berikut tidak akan mengembalikan apa pun:

{
  "query": {
    "term" : { "user" : "bennett" }
  }
}

match_phrase query akan menganalisis masukan jika penganalisis ditentukan untuk bidang yang ditanyakan dan menemukan dokumen yang cocok dengan kriteria berikut:

  • semua istilah harus muncul di lapangan
  • mereka harus memiliki urutan yang sama dengan nilai masukan

Misalnya, jika Anda mengindeks dokumen berikut (menggunakan standardpenganalisis untuk bidang tersebut foo):

{ "foo":"I just said hello world" }

{ "foo":"Hello world" }

{ "foo":"World Hello" }

Ini match_phrasepermintaan hanya akan mengembalikan dokumen pertama dan kedua:

{
  "query": {
    "match_phrase": {
      "foo": "Hello World"
    }
  }
}

query_stringpencarian kueri, secara default, pada bidang _all yang berisi teks dari beberapa bidang teks sekaligus. Selain itu, ini diurai dan mendukung beberapa operator (AND / OR ...), wildcard, dan seterusnya (lihat sintaks terkait ).

Sebagai match_phrasekueri, masukan dianalisis sesuai dengan set penganalisis di bidang kueri.

Berbeda dengan match_phrase, istilah yang diperoleh setelah analisis tidak harus berada dalam urutan yang sama, kecuali pengguna telah menggunakan tanda kutip di sekitar input.

Misalnya, menggunakan dokumen yang sama seperti sebelumnya, kueri ini akan mengembalikan semua dokumen:

{
  "query": {
    "query_string": {
      "query": "hello World"
    }
  }
}

Tapi kueri ini akan mengembalikan 2 dokumen yang sama dengan match_phrasekueri:

{
  "query": {
    "query_string": {
      "query": "\"Hello World\""
    }
  }
}

Masih banyak lagi yang bisa dikatakan tentang opsi yang berbeda untuk kueri tersebut, silakan lihat dokumentasi terkait:

Semoga ini cukup jelas dan ini akan membantu.

ThomasC
sumber
Penjelasan yang bagus, luar biasa, dan menyeluruh! Satu-satunya hal yang saya tidak jelas adalah apa sebenarnya yang dianalisis atau dilakukan ...
blee908
1
Sama-sama :) Penganalisis memproses teks untuk mendapatkan istilah yang akhirnya diindeks / dicari. Bacalah halaman Panduan Definitif ElasticSearch ini karena ini adalah konsep yang sangat penting untuk dipahami.
ThomasC
1
Ya, berasal dari SQL, ada banyak ide baru di sini. Perbedaan antara kueri dan filter, nilai persis vs teks lengkap, objek penelusuran JSON, dan cara penelusuran elastis menjalankan penelusurannya. BANYAK YANG HARUS DIAMBIL !!! Terima kasih untuk sumber dayanya!
blee908
1
@ThomasC Jika Anda memiliki {"foo": "Hello beautiful world"} di indeks Anda, apakah kueri yang cocok akan mengembalikan ini?
batmaci
1
@batmaci matchkueri menggunakan penganalisis jika bidang dianalisis, jadi ya. Secara default, ini akan mengembalikan dokumen yang memiliki setidaknya satu istilah (lihat parameter operator) dan urutannya tidak penting.
ThomasC
17

Saya pikir seseorang pasti mencari perbedaan di antara mereka sehubungan dengan PENCARIAN SEBAGIAN Berikut adalah analisis saya dengan 'penganalisis standar' default : -

Misalkan, Kami memiliki data: -

{"name": “Halo”}

Sekarang bagaimana jika kita ingin melakukan pencarian parsial dengan ell ???

Term Query ATAU Match query

{"term":{"name": "*ell*" }

Tidak akan berhasil, kembali mencatat.

{"term":{"name": "*zz* *ell*" }

Tidak akan berhasil, kembali mencatat.

Kesimpulan - Istilah atau Kecocokan sama sekali tidak dapat melakukan pencarian parsial

Wildcard Query: -

{"wildcard":{"name": "*ell*" }

Akan berhasil memberikan hasil {"name": "Hello"}

{"wildcard":{"name": "*zz* *ell*" }

Tidak akan berhasil, kembali mencatat.

Kesimpulan - wildcard dapat melakukan pencarian parsial hanya dengan satu token

Query_string: -

{"query_string": {"default_field": "name","query": "*ell*"}

Akan berhasil memberikan hasil {"name": “Hello”}

{"query_string": {"default_field": "name","query": "*zz* *ell*" }

Akan berhasil memberikan hasil {"name": “Hello”}.

Kesimpulan - query_string dapat mencari dengan dua token yang diberikan

-> di sini token adalah ell dan zz

Opster Elasticsearch Pro-Vijay
sumber
wildcard is able to do partial search with one token only: lebih tepatnya, wildcardkueri secara default hanya berfungsi pada keywordbidang , yang menurut definisi token tunggal. Itu tidak ada hubungannya dengan isi field lebih dari satu kata. Dalam kueri karakter pengganti Anda, "ozzy hello" akan cocok.
sox dengan Monica