Tidak ada pemetaan yang ditemukan untuk bidang untuk disortir di ElasticSearch

117

Elasticsearch membuat SearchParseExceptionpermintaan parsing sementara jika ada beberapa dokumen yang ditemukan tidak berisi bidang yang digunakan dalam kriteria pengurutan.

SearchParseException: Kegagalan Parse [Tidak ditemukan pemetaan untuk [harga] untuk disortir]

Bagaimana saya bisa berhasil mencari dokumen-dokumen ini, meskipun ada beberapa yang hilang priceisinya?

Yadu
sumber
1
Pertanyaan / jawaban Anda memecahkan masalah saya - terima kasih. Saya mengedit untuk menggeneralisasikannya, jangan ragu untuk melakukan rollback jika itu tidak cocok untuk Anda.
Paul Bellora
1
Referensi untuk menangani masalah ini Elasticsearch Link
Ajeesh

Jawaban:

116

Setelah menggali lebih banyak, saya menemukan solusinya seperti yang diberikan di bawah ini. ignore_unmappedharus secara eksplisit diatur ke truedalam klausa sortir.

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

Untuk informasi lebih lanjut, lihat referensi Elasticsearch untuk:

Yadu
sumber
Hai, Saya memiliki masalah yang sama dan saya tidak mengerti cara kerjanya ... Atribut yang hilang dan ignore_unmapped seharusnya bekerja sama, bukan? Jika misalnya saya menetapkan hilang ke "_last" dan ignore_unmapped ke "false", saya masih memiliki masalah tetapi saya ingin dokumen ada di hasil di semua kasus bahkan jika mereka tidak memiliki atribut.
c4k
Saya memiliki masalah ini dan "ignore_unmapped" tidak berfungsi jika _type Anda kosong (tanpa indeks dokumen apa pun).
reinaldoluckman
7
Tampak seperti strategi baru adalah untuk penggunaan unmapped_type
lukmdo
2
Pertanyaan saya selalu berfungsi hingga hari ini tanpa memperbarui perpustakaan apa pun, dll. Tetapi hari ini saya mulai mendapatkan kesalahan yang sama. Saya sekarang menambahkan "ignore_unmapped" : truedan itu mulai bekerja lagi tetapi yang aneh adalah, apa yang terjadi di belakang layar! Siapa tahu! Bagaimanapun, itu berhasil sekarang. +1
BentCoder
1
Dapatkah seseorang menjelaskan perbedaan antara "hilang" dan "tidak terpetakan"? Untuk bidang tertentu, jika beberapa dokumen memilikinya sementara yang lain tidak, apakah bidang tersebut diperlakukan sebagai "hilang" atau "tidak dipetakan"? Apakah "tidak ada" berarti kolom tersebut ada di dokumen tetapi nilai yang sesuai adalah null?
Sher10ck
43

Bagi yang mencari contoh keduanya ignore_unmappeddan unmapped_typesilakan lihat tanggapan saya di sini .

Perhatikan bahwa "ignore_unmapped" sekarang sudah tidak digunakan lagi dan menggantikan "unmapped_type". Ini dilakukan sebagai bagian dari # 7039

Dari dokumentasi: Sebelum 1.4.0 ada parameter boolean ignore_unmapped, yang tidak cukup informasi untuk memutuskan nilai pengurutan yang akan dikeluarkan, dan tidak berfungsi untuk pencarian lintas indeks. Ini masih didukung tetapi pengguna didorong untuk bermigrasi ke unmapped_type baru sebagai gantinya.

Secara default, permintaan pencarian akan gagal jika tidak ada pemetaan yang terkait dengan suatu bidang. Opsi unmapped_type memungkinkan untuk mengabaikan bidang yang tidak memiliki pemetaan dan tidak mengurutkannya. Nilai parameter ini digunakan untuk menentukan nilai urut apa yang akan dikeluarkan. Berikut adalah contoh bagaimana itu dapat digunakan:

{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} },
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Jika salah satu indeks yang ditanyakan tidak memiliki pemetaan harga, maka Elasticsearch akan menanganinya seolah-olah ada pemetaan jenis panjang, dengan semua dokumen dalam indeks ini tidak memiliki nilai untuk bidang ini.

Navneet Kumar
sumber
3

Rupanya ElasticSearch tidak akan mengurutkan nilai nol. Saya berasumsi itu akan memperlakukan null sebagai awal atau akhir (seperti dengan pengurutan SQL) tetapi saya percaya itu juga memicu kesalahan ini.

Jadi, jika Anda melihat kesalahan ini, Anda mungkin perlu memastikan atribut sort memiliki nilai default saat dikirim ke ElasticSearch.

Saya mengalami kesalahan ini dengan Rails + ElasticSearch + Tire karena kolom sortir tidak memiliki nilai default, jadi dikirim ke ES sebagai null.

Masalah ini menunjukkan penanganan nilai null, tetapi itu bukan pengalaman saya. Itu sesuatu yang pantas untuk dicoba.

mahemoff
sumber
2

Saya mengalami masalah yang sama (agak; akan mendapatkan beberapa kesalahan, tetapi beberapa hasil), tetapi dalam kasus saya pencarian saya dikeluarkan di root (tidak ada indeks yang ditentukan), dan kesalahan yang saya dapatkan adalah karena pencarian / pesanan juga mencari indeks Kibana.

Kesalahan bodoh, tapi mungkin ini akan membantu orang lain yang berakhir di sini.

James Boutcher
sumber
saya memiliki masalah yang sama .. tetapi ketika saya menentukan abaikan yang tidak dipetakan, saya tidak mendapatkan penyortiran sama sekali saat mencari root ... ini membatasi kemampuan untuk mencari saya jika saya harus menentukan indeks ... saya hanya ingin semua hasil yang cocok untuk diurutkan berdasarkan bidang jika ada, dan isi gunakan default untuk yang tidak .. EDIT:
mgoetzke
2

Elasticsearch 6.4

cukup tentukan indeksnya dan hanya itu di Kibana

SEBELUM

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

SETELAH

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}
Brian Sanchez
sumber
1

jika Anda menggunakan es 6.7

coba yang ini

sort : ["title.keyword:desc"]
Khalid Skiod
sumber
Ini membantu saya - elastis 7,3
mirik
0

Anda juga bisa menggunakan skrip yang memberi Anda fleksibilitas:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}
Rafal Enden
sumber
0

Ketika kami menggunakan kode di bawah ini, di mana added_on adalah tanggal, apa yang terjadi !! atribut teks dianalisis, artinya akan dipecah menjadi kata-kata yang berbeda saat disimpan, dan memungkinkan pencarian teks bebas pada satu atau lebih kata di lapangan

jadi ada "teks" dan "kata kunci" yang terkait dengan bidang, jadi jika kita perlu menggunakan agregasi dalam kueri, kita membutuhkan nilai bidang secara umum kata kunci.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Abhishek
sumber