Permintaan vs. Filter


198

Saya tidak dapat melihat deskripsi kapan saya harus menggunakan kueri atau filter atau kombinasi keduanya. Apa perbedaan di antara mereka? Adakah yang bisa menjelaskannya?


46
Dokumentasi resmi sebenarnya tidak terlalu jelas
geekazoid

2
Sepertinya ada halaman yang muncul dengan penjelasan lebih lanjut: elastic.co/guide/en/elasticsearch/guide/master/…
Dmitry Polushkin

6
Perlu dicatat bahwa kueri dan filter akan digabung dalam ES 2.0, maka sebagian besar dari apa yang dikatakan dan ditulis untuk kueri vs filter tidak akan berlaku lagi. Periksa juga posting blog resmi yang mengumumkan perubahan ini.
Val

Jawaban:


201

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.


19
Benar begitu, jika pengguna melakukan pencarian tipe google maka saya akan menggunakan query? Jika mereka memilih nilai yang mungkin dari drop-down (mis., Jumlah faktur> 50) maka ini akan menjadi filter?
Jonesie

4
Yap, itu benar sekali. Setiap kali Anda perlu membatasi seluruh kumpulan dokumen dengan beberapa metrik, biasanya itu merupakan kasus yang sesuai dengan filter. Jadi mungkin berdasarkan usia, panjang, ukuran, dll.
Zach

Solusi saya menggunakan filter dan kueri dalam permintaan yang sama dan sangat cepat pada basis data pengujian. Kami akan segera mendapatkan data langsung di sana untuk melihat seberapa cepat itu sebenarnya.
Jonesie

@ Zach Agar benar-benar jelas, dalam sistem multi-penyewa -dengan izin untuk pengguna dalam penyewa-, kedengarannya seperti informasi penyewa / otentikasi akan menjadi filter yang ditambahkan ke setiap kueri (yaitu Query yang Difilter). Baik?
Scott Willeke

4
@activescott Yap, itulah yang akan saya lakukan. Anda juga dapat mengatur alias yang difilter agar "alias pengguna" selalu menerapkan filter yang sesuai. Membuat administrasi lebih mudah dan tidak memerlukan perubahan kode untuk memperbarui kueri, tambahan kesalahan dalam permintaan Anda, dll.
Zach

99

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

ketika saya ingin menghapus dokumen, haruskah saya menggunakan filter jika mungkin? Saya tidak ingin di-cache
Rytek

saat menghapus dokumen, Anda tidak memerlukan skor apa pun, Anda juga tidak perlu melakukan pencarian teks lengkap. Jadi ini akan menjadi filter daripada, karena Anda hanya perlu membuat keputusan delete / not delete. filter-query-context
nonNumericalFloat

13

Contoh (coba sendiri)

Say index myindexberisi 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

Permintaan 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

Filter 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 helloatau samdikembalikan. Dokumen TIDAK diberi skor .

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

Kecuali Anda membutuhkan pencarian teks penuh atau penilaian, filter lebih disukai karena filter yang sering digunakan akan di-cache secara otomatis oleh Elasticsearch, untuk mempercepat kinerja. Lihat Elasticsearch: Konteks kueri dan filter.


11

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.


1
Menarik! Saya tidak menyadari filter terjadi sebelum permintaan. Caching filter lebih masuk akal sekarang.
Constant Meiring

Tidak selalu. Perbedaan dasar dan utama antara kueri skor yang difilter dan konstan. Skor konstan selalu menjalankan kueri terlebih dahulu lalu menerapkan filter di atasnya. Bahkan permintaan yang difilter memiliki pengaturan yang dapat dijalankan oleh query sebelum filter.
piyushGoyal

10

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.


Tidak bisakah Anda memberikan contoh badan permintaan?
Anjing

9

Filters-> Apakah dokumen ini cocok? biner ya atau tidak jawabannya

Queries-> Apakah dokumen ini cocok? Seberapa baik cocok? menggunakan penilaian


0

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.

Sumber: https://logz.io/blog/elasticsearch-queries/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.