Saya tidak dapat melihat deskripsi kapan saya harus menggunakan kueri atau filter atau kombinasi keduanya. Apa perbedaan di antara mereka? Adakah yang bisa menjelaskannya?
Saya tidak dapat melihat deskripsi kapan saya harus menggunakan kueri atau filter atau kombinasi keduanya. Apa perbedaan di antara mereka? Adakah yang bisa menjelaskannya?
Jawaban:
Perbedaannya sederhana: filter di-cache dan tidak memengaruhi skor, karena itu lebih cepat daripada kueri. Lihat di sini juga. Katakanlah kueri biasanya adalah sesuatu yang diketik pengguna dan tidak dapat diprediksi, sementara filter membantu pengguna mempersempit hasil pencarian, misalnya menggunakan aspek.
Inilah yang dikatakan dokumentasi resmi:
Sebagai aturan umum, filter harus digunakan alih-alih kueri:
- untuk pencarian biner ya / tidak
- untuk kueri pada nilai yang tepat
Sebagai aturan umum, kueri harus digunakan sebagai pengganti filter:
- untuk pencarian teks lengkap
- di mana hasilnya tergantung pada skor relevansi
Say index myindex
berisi tiga dokumen:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
Kueri: Seberapa baik dokumen cocok dengan kueri
hello sam
(menggunakan kata kunci must
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
Dokumen "Hello world! I am Sam."
diberi skor lebih tinggi daripada "Hello world!"
, karena yang pertama cocok dengan kedua kata dalam kueri. Dokumen diberi skor.
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
Filter: Apakah suatu dokumen cocok dengan kueri
hello sam
(menggunakan kata kunci filter
)curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Dokumen yang mengandung salah satu hello
atau sam
dikembalikan. Dokumen TIDAK diberi skor .
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
Lebih sedikit tambahan untuk hal yang sama. Filter diterapkan terlebih dahulu dan kemudian kueri diproses atas hasilnya. Untuk menyimpan biner true / false match per dokumen, sesuatu yang disebut bitSet Array digunakan. Array BitSet ini ada dalam memori dan ini akan digunakan dari kedua kalinya filter ditanyai. Dengan cara ini, menggunakan struktur data bitset array, kami dapat memanfaatkan hasil cache.
Satu hal lagi yang perlu diperhatikan di sini, cache filter dibuat hanya ketika permintaan dieksekusi maka hanya dari klik kedua, kita benar-benar mendapatkan keuntungan dari caching.
Tapi kemudian Anda bisa menggunakan API yang lebih hangat , untuk mengatasi hal ini. Saat Anda mendaftarkan kueri dengan filter terhadap API yang lebih hangat, itu akan memastikan bahwa ini dijalankan terhadap segmen baru setiap kali itu ditayangkan. Karenanya kita akan mendapatkan kecepatan yang konsisten dari eksekusi pertama itu sendiri.
Pada dasarnya, kueri digunakan ketika Anda ingin melakukan pencarian pada dokumen Anda dengan penilaian. Dan filter digunakan untuk mempersempit himpunan hasil yang diperoleh dengan menggunakan kueri. Filter adalah boolean.
Misalnya katakan Anda memiliki indeks restoran seperti zomato. Sekarang Anda ingin mencari restoran yang menyajikan 'pizza' , yang pada dasarnya adalah kata kunci pencarian Anda.
Jadi, Anda akan menggunakan kueri untuk menemukan semua dokumen yang mengandung "pizza" dan beberapa hasil akan diperoleh.
Katakan sekarang Anda ingin daftar restoran yang menyajikan pizza dan memiliki peringkat minimal 4.0.
Jadi yang harus Anda lakukan adalah menggunakan kata kunci "pizza" dalam permintaan Anda dan menerapkan filter untuk peringkat sebagai 4.0.
Apa yang terjadi adalah bahwa filter biasanya diterapkan pada hasil yang diperoleh dengan menanyakan indeks Anda.
Filters
-> Apakah dokumen ini cocok? biner ya atau tidak jawabannya
Queries
-> Apakah dokumen ini cocok? Seberapa baik cocok? menggunakan penilaian
Karena versi 2 dari Elasticsearch, filter dan kueri telah digabung dan setiap klausa kueri dapat digunakan sebagai filter atau kueri (tergantung pada konteksnya). Seperti dengan versi 1, filter di-cache dan harus digunakan jika penilaian tidak masalah.