Nessuna mappatura trovata per il campo per l'ordinamento in ElasticSearch


117

Elasticsearch lancia una SearchParseExceptionquery durante l'analisi se sono presenti alcuni documenti trovati che non contengono campi utilizzati nei criteri di ordinamento.

SearchParseException: errore di analisi [nessuna mappatura trovata per [prezzo] per ordinare in base a]

Come posso cercare con successo questi documenti, anche se in alcuni manca il pricecampo?


1
La tua domanda / risposta ha risolto il mio problema - grazie. Ho modificato per generalizzarlo un po ', sentiti libero di tornare indietro se non ti si addice.
Paul Bellora

1
Riferimento per la gestione di questo problema Elasticsearch Link
Ajeesh

Risposte:


116

Dopo aver scavato di più, ho trovato la soluzione come indicato di seguito. ignore_unmappeddovrebbe essere impostato esplicitamente truenella clausola di ordinamento.

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

Per ulteriori informazioni dai un'occhiata alle referenze di Elasticsearch per:


Ciao, ho lo stesso problema e non capisco come funziona ... Gli attributi mancanti e ignore_unmapped dovrebbero funzionare insieme, giusto? Se ad esempio imposto missing su "_last" e ignore_unmapped su "false", ho ancora il problema ma voglio che i documenti siano nei risultati in tutti i casi anche se non hanno l'attributo.
c4k

Ho questo problema e "ignore_unmapped" non funziona se il tuo _type è vuoto (cioè senza alcun documento indicizzato).
reinaldoluckman

7
Sembra che la nuova strategia sia quella di utilizzare unmapped_type
lukmdo

2
Le mie query hanno sempre funzionato fino ad oggi senza aggiornare alcuna libreria ecc. Ma oggi ho iniziato a ricevere lo stesso errore. Ora ho aggiunto "ignore_unmapped" : truee ha ricominciato a funzionare, ma la cosa strana è cosa è successo dietro le quinte! Chissà! Comunque, ora funziona. +1
BentCoder

1
Qualcuno può chiarire la differenza tra "mancante" e "non mappato"? Per un determinato campo, se alcuni documenti lo hanno mentre altri no, tale campo viene considerato "mancante" o "non mappato"? "Mancante" significa che il campo è nel documento ma il valore corrispondente è nullo?
Sher10ck

43

Per coloro che cercano un esempio di entrambi ignore_unmappede unmapped_typevedere la mia risposta qui .

Nota che "ignore_unmapped" è ora deprecato a favore di "unmapped_type". Questo è stato fatto come parte di # 7039

Dalla documentazione: prima della 1.4.0 c'era il parametro booleano ignore_unmapped, che non era informazioni sufficienti per decidere i valori di ordinamento da emettere, e non funzionava per la ricerca tra indici. È ancora supportato ma gli utenti sono incoraggiati a migrare invece al nuovo unmapped_type.

Per impostazione predefinita, la richiesta di ricerca fallirà se non è presente alcuna mappatura associata a un campo. L'opzione unmapped_type consente di ignorare i campi che non hanno mappatura e di non ordinarli in base a essi. Il valore di questo parametro viene utilizzato per determinare quali valori di ordinamento emettere. Ecco un esempio di come può essere utilizzato:

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

Se uno qualsiasi degli indici interrogati non ha una mappatura per il prezzo, Elasticsearch lo gestirà come se ci fosse una mappatura di tipo long, con tutti i documenti in questo indice che non hanno alcun valore per questo campo.


3

Apparentemente ElasticSearch non ordinerà su valori nulli. Presumevo che avrebbe considerato null come all'inizio o alla fine (come con l'ordinamento SQL) ma credo che inneschi anche questo errore.

Quindi, se vedi questo errore, potresti dover assicurarti che l'attributo di ordinamento abbia un valore predefinito quando viene inviato a ElasticSearch.

Ho riscontrato questo errore con Rails + ElasticSearch + Tyre perché la colonna di ordinamento non aveva un valore predefinito, quindi è stata inviata a ES come null.

Questo problema indica la gestione dei valori null, ma non è stata la mia esperienza. È comunque qualcosa che vale la pena provare.


2

Ho riscontrato lo stesso problema (più o meno; avrei ricevuto alcuni errori, ma alcuni risultati), ma nel mio caso la mia ricerca veniva eseguita alla radice (nessun indice specificato) e gli errori che stavo ottenendo erano perché anche la ricerca / ordine era cercando un indice Kibana.

Errore stupido, ma forse questo aiuterà qualcun altro che finisce qui.


ho lo stesso problema ... ma quando specifico ignora non mappato non ottengo alcun ordinamento durante la ricerca nella radice ... questo limita la possibilità di cercarmi se devo definire l'indice ... vorrei semplicemente tutto risultati corrispondenti per essere ordinati in base a un campo, se esiste, e riempire usa un valore predefinito per quelli che non lo fanno .. MODIFICARE:
mgoetzke

2

Elasticsearch 6.4

specifica semplicemente l'indice e il gioco è fatto in Kibana

PRIMA

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

DOPO

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

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

1

se stai usando es 6.7

prova questo

sort : ["title.keyword:desc"]

Mi ha aiutato - elastico 7.3
mirik

0

Puoi anche usare uno script che ti dà una certa flessibilità:

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

0

Quando usiamo il codice sottostante, dove added_on è la data, cosa succede !! il testo dell'attributo viene analizzato, il che significa che viene suddiviso in parole distinte quando memorizzato e consente ricerche a testo libero su una o più parole nel campo

quindi ci sono "testo" e "parola chiave" associati ai campi, quindi se dobbiamo utilizzare l'aggregazione nella query, abbiamo bisogno del valore del campo in generale della parola chiave.

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.