Saat ini saya mencoba untuk memigrasi aplikasi berbasis solr ke elasticsearch.
Saya punya permintaan lucene ini
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
Sejauh yang saya mengerti ini adalah kombinasi dari klausa HARUS dikombinasikan dengan boolean ATAU:
"Dapatkan semua dokumen yang berisi (foo DAN bilah di nama) ATAU (foo DAN bilah di info). Setelah itu hasil filter dengan kondisi kondisi = 1 dan meningkatkan dokumen yang memiliki gambar."
Saya telah mencoba menggunakan permintaan bool dengan HARUS tetapi saya gagal untuk mendapatkan boolean ATAU menjadi harus klausa. Inilah yang saya miliki:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
Seperti yang Anda lihat, HARUS kondisi untuk "info" tidak ada.
Adakah yang punya solusi?
Terima kasih banyak.
** PEMBARUAN **
Saya telah memperbarui kueri elasticsearch dan menyingkirkan skor fungsi itu. Masalah basis saya masih ada.
sumber
Jawaban:
Contoh:
Anda ingin melihat semua item yang ada (bulat DAN (merah ATAU biru)):
Anda juga dapat melakukan versi OR yang lebih kompleks, misalnya jika Anda ingin mencocokkan setidaknya 3 dari 5, Anda dapat menentukan 5 opsi di bawah "harus" dan menetapkan "minimum_harus" dari 3.
Terima kasih kepada Glen Thompson dan Sebastialonso untuk menemukan di mana sarang saya tidak benar sebelumnya.
Terima kasih juga kepada Fatmajk karena menunjukkan bahwa "istilah" menjadi "cocok" di ElasticSearch 6.
sumber
should
ke tingkat atasbool
, dan termasuk sebuahminimum_should_match: 1
karya?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. Apakah ini entah bagaimana versi tergantung?minimum_should
adalah 1, dan membungkusnya dalambool
hasil di grup itu benar jika setidaknya satu item cocok, salah jika tidak ada yang cocok. Motivasi saya untuk menciptakan jawaban ini adalah bahwa saya sedang memecahkan masalah seperti ini, dan dokumentasi yang tersedia dan bahkan jawaban yang dapat saya temukan di situs-situs seperti ini tidak membantu, jadi saya terus meneliti sampai saya merasa memiliki pemahaman yang cukup kuat. dari apa yang sedang terjadi. Saya dengan senang hati menyambut petunjuk konstruktif tentang bagaimana saya dapat meningkatkan jawaban lebih lanjut.Saya akhirnya berhasil membuat kueri yang melakukan persis apa yang saya inginkan:
Kueri boolean bersarang yang difilter. Saya tidak yakin mengapa ini tidak didokumentasikan. Mungkin seseorang di sini bisa memberitahuku?
Ini pertanyaannya:
Dalam pseudo-SQL:
Harap diingat bahwa itu tergantung pada analisis bidang dokumen Anda dan pemetaan bagaimana nama = foo ditangani secara internal. Ini dapat bervariasi dari fuzzy ke perilaku ketat.
"minimum_should_match": 1 mengatakan, bahwa setidaknya salah satu dari pernyataan harus benar.
Pernyataan ini berarti bahwa setiap kali ada dokumen di resultset yang berisi has_image: 1 didorong oleh faktor 100. Perubahan ini menghasilkan urutan.
Selamat bersenang-senang :)
sumber
Ini adalah bagaimana Anda dapat membuat sarang beberapa pertanyaan bool dalam satu permintaan bool luar menggunakan Kibana ini,
Ini adalah bagaimana Anda bisa membuat sarang permintaan di ES
Ada lebih banyak jenis dalam "bool" seperti -
Saring
tidak harus
sumber
Saya baru-baru ini harus menyelesaikan masalah ini juga, dan setelah BANYAK percobaan dan kesalahan saya datang dengan ini (dalam PHP, tetapi peta langsung ke DSL):
Yang memetakan sesuatu seperti ini di SQL:
Kunci dari semua ini adalah
minimum_should_match
pengaturan. Tanpa ini yangfilter
benar - benar menimpashould
.Semoga ini bisa membantu seseorang!
sumber
Di
must
Anda perlu menambahkan array kondisi permintaan yang ingin Anda kerjakanAND
danshould
Anda perlu menambahkan kondisi permintaan yang ingin Anda kerjakanOR
.Anda dapat memeriksa ini: https://github.com/Smile-SA/elasticsuite/issues/972
sumber
Jika Anda menggunakan parser kueri atau Lucene default Solr, Anda bisa memasukkannya ke dalam kueri string kueri:
Yang mengatakan, Anda mungkin ingin menggunakan permintaan boolean , seperti yang sudah Anda posting, atau bahkan kombinasi keduanya.
sumber