Nie znaleziono mapowania dla pola do sortowania w ElasticSearch

118

Elasticsearch zgłasza SearchParseExceptionzapytanie while parsowania, jeśli znaleziono jakieś dokumenty nie zawierające pola używanego w kryteriach sortowania.

SearchParseException: Parse Failure [Nie znaleziono mapowania dla [cena] w celu sortowania według]

Jak mogę pomyślnie przeszukiwać te dokumenty, nawet jeśli w niektórych brakuje pricepola?

Yadu
źródło
1
Twoje pytanie / odpowiedź rozwiązały mój problem - dziękuję. Edytowałem, aby nieco uogólnić, nie krępuj się wycofać, jeśli ci to nie odpowiada.
Paul Bellora,
1
Odniesienie do obsługi tego problemu Elasticsearch Link
Ajeesh

Odpowiedzi:

118

Po dalszych kopaniu znalazłem rozwiązanie podane poniżej. ignore_unmappedpowinna być jawnie ustawiona truew klauzuli sortowania.

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

Aby uzyskać więcej informacji, zapoznaj się z referencjami Elasticsearch dla:

Yadu
źródło
Cześć, mam ten sam problem i nie rozumiem, jak to działa ... Brakujące atrybuty i ignore_unmapped powinny działać razem, prawda? Jeśli na przykład ustawię brakujące na „_last” i ignore_unmapped na „false”, nadal mam problem, ale chcę, aby dokumenty były w wynikach we wszystkich przypadkach, nawet jeśli nie mają atrybutu.
c4k
Mam ten problem i "ignore_unmapped" nie działa, jeśli twój _type jest pusty (tj. Bez zindeksowanego dokumentu).
reinaldoluckman
7
Wygląda nowej strategii jest wykorzystanie unmapped_type
lukmdo
2
Moje zapytania zawsze działały do ​​dziś bez aktualizacji bibliotek itp., Ale dzisiaj zacząłem otrzymywać ten sam błąd. Dodałem teraz "ignore_unmapped" : truei znowu zaczęło działać, ale dziwne jest to, co wydarzyło się za sceną! Kto wie! Tak czy inaczej, teraz działa. +1
BentCoder
1
Czy ktoś może wyjaśnić różnicę między „brakującym” a „niezmapowanym”? Dla określonego pola, jeśli niektóre dokumenty je mają, a inne nie, to czy takie pole jest traktowane jako „brakujące” lub „niezamapowane”? Czy „brak” oznacza, że ​​pole jest w dokumencie, ale odpowiadająca mu wartość jest pusta?
Sher10ck
43

Dla tych, którzy szukają przykładu obu ignore_unmappedi unmapped_typezobacz moją odpowiedź tutaj .

Zauważ, że „ignore_unmapped” jest teraz przestarzałe i zastępuje „unmapped_type”. Zrobiono to w ramach # 7039

Z dokumentacji: Przed wersją 1.4.0 był parametr logiczny ignore_unmapped, który nie zawierał wystarczających informacji, aby zdecydować o emisji wartości sortowania i nie działał w przypadku wyszukiwania między indeksami. Jest nadal obsługiwany, ale zachęca się użytkowników do migracji do nowego unmapped_type.

Domyślnie żądanie wyszukiwania zakończy się niepowodzeniem, jeśli z polem nie jest skojarzone żadne mapowanie. Opcja unmapped_type pozwala zignorować pola, które nie mają mapowania i nie sortować według nich. Wartość tego parametru służy do określenia, jakie wartości sortowania mają być emitowane. Oto przykład, jak można go użyć:

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

Jeśli którykolwiek z odpytywanych indeksów nie ma mapowania ceny, Elasticsearch obsłuży to tak, jakby istniało odwzorowanie typu long, przy czym wszystkie dokumenty w tym indeksie nie mają wartości dla tego pola.

Navneet Kumar
źródło
3

Najwyraźniej ElasticSearch nie sortuje według wartości null. Zakładałem, że potraktuje wartość null jako początkową lub końcową (jak w przypadku porządkowania SQL), ale uważam, że również wyzwala ten błąd.

Jeśli więc zobaczysz ten błąd, może być konieczne upewnienie się, że atrybut sortowania ma wartość domyślną, gdy jest wysyłany do ElasticSearch.

Wystąpił ten błąd z Rails + ElasticSearch + Tire, ponieważ kolumna sortowania nie miała wartości domyślnej, więc została wysłana do ES jako null.

Ten problem wskazuje, że obsługiwane są wartości null, ale nie było to moje doświadczenie. I tak warto spróbować.

mahemoff
źródło
2

Wystąpił ten sam problem (sorta; otrzymywałem pewne błędy, ale niektóre wyniki), ale w moim przypadku moje wyszukiwanie było wykonywane w katalogu głównym (nie określono indeksu), a błędy, które otrzymywałem, były spowodowane tym, że wyszukiwanie / kolejność również patrząc na indeks Kibana.

Głupi błąd, ale może pomoże to komuś innemu, kto tu trafi.

James Boutcher
źródło
mam ten sam problem ... ale kiedy określę ignoruj ​​niezamapowane, nie otrzymuję żadnego sortowania podczas wyszukiwania w katalogu głównym ... ogranicza to możliwość wyszukiwania mnie, jeśli muszę zdefiniować indeks ... po prostu chciałbym wszystko pasujące wyniki mają być posortowane według pola, jeśli istnieje, i wypełnij wartość domyślną dla tych, których nie ma. EDYCJA:
mgoetzke
2

Elasticsearch 6.4

po prostu określ indeks i to wszystko w Kibanie

PRZED

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

PO

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

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}
Brian Sanchez
źródło
1

jeśli używasz es 6.7

Spróbuj tego

sort : ["title.keyword:desc"]
Khalid Skiod
źródło
Pomogło mi - elastyczne 7,3
mirik
0

Możesz także użyć skryptu, który daje pewną elastyczność:

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

Kiedy użyjemy poniższego kodu, gdzie added_on to data, co się dzieje !! tekst atrybutu jest analizowany, co oznacza, że ​​jest dzielony na odrębne słowa podczas przechowywania i umożliwia wyszukiwanie dowolnego tekstu na jednym lub kilku słowach w polu

więc istnieje „tekst” i „słowo kluczowe” powiązane z polami, więc jeśli musimy użyć agregacji w zapytaniu, potrzebujemy wartości pola jako słowa kluczowego.

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Abhishek
źródło