ElasticSearch'te sıralamak için alan için eşleşme bulunamadı


118

Elasticsearch SearchParseException, sıralama ölçütlerinde kullanılan alanı içermeyen bazı belgeler bulunursa, bir süre ayrıştırma sorgusu atar .

SearchParseException: Ayrıştırma Hatası [Sıralamak için [fiyat] için eşleme bulunamadı]

Bazılarında pricealan eksik olsa bile, bu belgeleri nasıl başarılı bir şekilde arayabilirim ?


1
Sorunuz / cevabınız sorunumu çözdü - teşekkür ederim. Biraz genelleştirmek için düzenledim, size uymuyorsa geri almaktan çekinmeyin.
Paul Bellora

1
Bu sorunu ele almak için referans
Elasticsearch

Yanıtlar:


118

Daha fazla kazdıktan sonra çözümü aşağıda verildiği gibi buldum. sort yan tümcesinde ignore_unmappedaçıkça ayarlanmalıdır true.

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

Daha fazla bilgi için Elasticsearch referanslarına bakın:


Merhaba, bende de aynı sorun var ve bunun nasıl çalıştığını anlamıyorum ... Eksik ve ignore_unmapped özellikleri birlikte çalışmalı değil mi? Örneğin, "_last" olarak eksik ve ignore_unmapped öğesini "false" olarak ayarlarsam, sorun yine de yaşıyorum, ancak belgelerin özniteliğe sahip olmasalar bile sonuçlarda olmasını istiyorum.
c4k

Bu sorunu yaşıyorum ve "ignore_unmapped", _type'ınız boşsa (yani herhangi bir belge indekslenmemişse) çalışmıyor.
reinaldoluckman

7
Yeni strateji gibi görünüyor kullanımı etmektir unmapped_type
lukmdo

2
Sorgularım herhangi bir kitaplığı vb. Güncellemeden bugüne kadar hep çalıştı ama bugün aynı hatayı almaya başladım. Şimdi ekledim "ignore_unmapped" : trueve tekrar çalışmaya başladı ama tuhaf olan şey, sahnenin arkasında ne oldu! Kim bilir! Neyse, şimdi çalışıyor. +1
BentCoder

1
Birisi "eksik" ve "eşlenmemiş" arasındaki farkı netleştirebilir mi? Belli bir alan için, bazı belgelerde varsa, bazılarında yoksa, bu alan "eksik" veya "eşlenmemiş" olarak değerlendirilir mi? "Eksik", alanın belgede olduğu ancak karşılık gelen değerin boş olduğu anlamına mı gelir?
Sher10ck

44

Her iki örneği arayanlar için ignore_unmappedve unmapped_typebakın burada tepkisini .

"İgnore_unmapped" seçeneğinin artık "unmapped_type" lehine kullanımdan kaldırıldığını unutmayın. Bu, # 7039'un bir parçası olarak yapıldı

Dokümantasyondan: 1.4.0'dan önce, yayılacak sıralama değerlerine karar vermek için yeterli bilgi olmayan ve çapraz dizin araması için çalışmayan ignore_unmapped boolean parametresi vardı. Hala desteklenmektedir ancak kullanıcıların bunun yerine yeni unmapped_type'a geçmeleri önerilir.

Varsayılan olarak, bir alanla ilişkilendirilmiş eşleştirme yoksa arama isteği başarısız olur. Unmapped_type seçeneği, eşlemesi olmayan ve onlara göre sıralanmayan alanların yok sayılmasına izin verir. Bu parametrenin değeri, hangi sıralama değerlerinin yayınlanacağını belirlemek için kullanılır. İşte nasıl kullanılabileceğine dair bir örnek:

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

Sorgulanan endekslerden herhangi birinin fiyat için bir eşlemesi yoksa, Elasticsearch, bu dizindeki tüm belgelerin bu alan için hiçbir değeri olmayacak şekilde, uzun bir tür eşlemesi varmış gibi işleyecektir.


3

Görünüşe göre ElasticSearch boş değerlere göre sıralama yapmıyor. Boş değerin başlangıçta veya sonda olduğunu varsayıyordum (SQL siparişinde olduğu gibi) ancak bu hatayı da tetiklediğine inanıyorum.

Dolayısıyla bu hatayı görürseniz, sort özniteliğinin ElasticSearch'e gönderildiğinde varsayılan bir değere sahip olduğundan emin olmanız gerekebilir.

Rails + ElasticSearch + Tire ile bu hatayı yaşadım çünkü sıralama sütunu varsayılan bir değere sahip değildi, bu yüzden ES'ye boş olarak gönderiliyordu.

Bu sorun , boş değerlerin işlendiğini gösteriyor, ancak benim deneyimim değildi. Yine de denemeye değer bir şey.


2

Aynı sorunu yaşadım (sorta; bazı hatalar alırdım, ancak bazı sonuçlar), ancak benim durumumda aramam kökte yayınlanıyordu (dizin belirtilmedi) ve aldığım hatalar, arama / siparişin de Kibana endeksine bakıyor.

Aptalca bir hata, ama belki bu burada biten bir başkasına yardımcı olur.


bende de aynı sorun var .. ama eşlenmemiş olanı görmezden geldiğimi belirttiğimde, kökte arama yaparken herhangi bir sıralama alamıyorum ... bu, dizini tanımlamam gerekirse beni arama yeteneğini sınırlar ... sadece hepsini isterdim eşleşen sonuçlar, varsa bir alana göre sıralanacak ve doldurulmayanlar için bir varsayılan kullanın .. DÜZENLE:
mgoetzke

2

Elasticsearch 6.4

sadece dizini belirtin ve bu Kibana'da

ÖNCE

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

SONRA

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

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

1

es 6.7 kullanıyorsanız

bunu dene

sort : ["title.keyword:desc"]

Bana yardımcı oldu - elastik 7.3
mirik

0

Ayrıca size biraz esneklik sağlayan komut dosyası da kullanabilirsiniz:

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

0

Aşağıdaki kodu kullandığımızda, added_on tarih olduğunda ne olur !! öznitelik metni analiz edilir, yani saklandığında farklı kelimelere bölünür ve alandaki bir veya daha fazla kelime üzerinde serbest metin aramalarına izin verir

bu nedenle alanlarla ilişkili "metin" ve "anahtar kelime" vardır, bu nedenle sorguda toplamayı kullanmamız gerekirse, genel olarak anahtar kelime alan değerine ihtiyacımız vardır.

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.