Elasticsearch perbedaan antara MUST dan HARUS bool query

168

Apa perbedaan antara MUSTdan SHOULDpermintaan bool di ES?

Jika saya HANYA ingin hasil yang mengandung istilah saya yang harus saya gunakan must?

Saya memiliki kueri yang seharusnya hanya berisi nilai-nilai tertentu, dan juga tidak ada hasil yang memiliki tanggal / timestamp lebih rendah daripada waktu / tanggal todays - SEKARANG

Juga

Dapatkah saya menggunakan beberapa filter di dalam suatu keharusan seperti kode di bawah ini:

"filtered": {
"filter": {
"bool" : {
        "must" : {
            "term" : { "type" : 1 }
            "term" : { "totals" : 14 }
            "term" : { "groupId" : 3 }
            "range" : {
                "expires" : {
                    "gte": "now"
                }
            }
        },
pengguna2722667
sumber

Jawaban:

249

harus berarti: Klausa (kueri) harus muncul dalam dokumen yang cocok. Klausa ini harus cocok, seperti logika AND .

harus berarti: Setidaknya satu dari klausa ini harus cocok, seperti logis ATAU .

Pada dasarnya mereka digunakan seperti operator logis AND dan OR. Lihat ini .

Sekarang dalam permintaan bool :

harus berarti: Klausa yang harus cocok dengan dokumen yang akan dimasukkan.

harus berarti: Jika klausa ini cocok, mereka meningkatkan _score; jika tidak, mereka tidak memiliki efek. Mereka hanya digunakan untuk memperbaiki skor relevansi untuk setiap dokumen.


Ya, Anda dapat menggunakan beberapa filter di dalam must.

Utsav Dawn
sumber
Agak terlambat ke pesta, tapi bagaimana mustuntuk kategori, atau harga, dan shoulduntuk atribut, seperti ukuran dan warna. Sekarang, jika ukuran L dan XL dipilih, itu adalah keharusan di antara keduanya, tetapi jika warna hijau juga dipilih, itu harus menjadi keharusan untuk (ukuran L ATAU XL) DAN (warna hijau). Apakah itu mungkin?
Mave
Saya percaya bahwa filter kasus mungkin pendekatan yang lebih baik untuk atribut. Mereka diarahkan untuk pencocokan tepat dan bukan pencarian berbasis relevansi. Lihat pertanyaan dan filter dalam dokumen untuk info lebih lanjut.
Jim K.
6
Saya pikir Anda perlu memiliki minimum_number_should_match = 1untuk menegakkan gagasan bahwa "setidaknya satu dari klausa ini harus cocok".
Jim K.
Jawaban yang bagus! Saya hanya ingin berbagi bagian dari dokumentasi yang sangat membantu saya untuk memahami hal ini. elastic.co/guide/en/elasticsearch/guide/current/...
ba0708
1
JimK - atau tidak harus ada klausa. Ketika tidak ada harus klausa, minimum_number_should_match tersirat.
LizH
15

Karena ini adalah pertanyaan yang populer, saya ingin menambahkan bahwa dalam versi Elasticsearch 2 hal berubah sedikit.

Alih-alih filteredpermintaan, seseorang harus menggunakan boolpermintaan di tingkat atas.

Jika Anda tidak peduli dengan skor mustbagian, maka masukkan bagian-bagian itu ke dalam filterkunci. Tanpa skor berarti pencarian lebih cepat. Juga, Elasticsearch akan secara otomatis mencari tahu, apakah akan menyimpannya, dll. must_notSama-sama valid untuk caching.

Referensi: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

Juga, pikiran yang "gte": "now"tidak bisa di-cache, karena granularity milidetik. Gunakan dua rentang dalam mustklausa: satu dengan now/1hdan lainnya dengan nowsehingga yang pertama dapat di-cache untuk sementara waktu dan yang kedua untuk pemfilteran yang tepat dipercepat pada hasil yang lebih kecil.

TautrimasPajarskas
sumber
8

Seperti yang dikatakan dalam dokumentasi :

Harus: Klausul (kueri) harus muncul dalam dokumen yang cocok.

Haruskah: Klausul (permintaan) akan muncul di dokumen yang cocok. Dalam kueri boolean tanpa harus ada klausa, satu atau lebih harus klausa harus cocok dengan dokumen. Jumlah minimum klausa yang harus cocok dapat diatur menggunakan parameter minimum_should_match.

Dengan kata lain, hasil harus dicocokkan dengan semua pertanyaan yang ada dalam klausa harus (atau cocokkan setidaknya satu dari klausa harus jika tidak ada harus klausa.

Karena Anda ingin hasil Anda memuaskan semua pertanyaan, Anda harus menggunakan harus .


Anda memang dapat menggunakan filter di dalam kueri boolean.

Heschoon
sumber
10
Saya pikir maksud Anda "Anda harus menggunakan harus" daripada "Anda harus menggunakan harus" ;-)
jarmod