2013-06-11 22 views
69

Elasticsearch genera uno SearchParseException mentre analizza la query se sono presenti alcuni documenti trovati che non contengono il campo utilizzato nei criteri di ordinamento.Nessuna mappatura trovata per il campo per ordinare in ElasticSearch

SearchParseException: Parse mancata [alcun mapping trovato per [prezzo] al fine di risolvere il]

Come posso cercare con successo questi documenti, anche se alcuni manca il campo price?

+1

La tua domanda/risposta ha risolto il mio problema - grazie. Ho modificato per generalizzare un po ', sentiti libero di rollback se non ti va bene. –

+0

Riferimento per la gestione di questo problema [Link Elasticsearch] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html) – Ajeesh

risposta

78

Dopo aver scavato di più, ho trovato la soluzione come indicato di seguito. ignore_unmapped deve essere impostato in modo esplicito su true nella clausola sort.

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

Per ulteriori informazioni uno sguardo ai riferimenti elasticsearch per:

+0

Ciao, ho lo stesso problema e non lo faccio capisco come funziona ... Gli attributi mancanti e ignore_unmapped dovrebbero funzionare insieme giusto? Se per esempio ho impostato "_last" mancante 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

+0

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

+2

Sembra che la nuova strategia sia quella di utilizzare [unmapped_type] (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-sort.html#_ignoring_unmapped_fields) – lukmdo

0

ho sperimentato lo stesso problema (sorta; otterrebbe alcuni errori, ma alcuni risultati), ma nel mio caso la mia ricerca veniva emessa alla radice (nessun indice specificato), e gli errori che stavo ottenendo erano perché il mare rch/order stava anche cercando un indice Kibana.

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

+0

ho lo stesso problema .. ma quando ho specificato ignora non mappato non ottengo alcun tipo di ordinamento durante la ricerca della radice ... questo limita la capacità di cercare me se devo definire l'indice ... vorrei semplicemente vuoi che tutti i risultati corrispondenti vengano ordinati per un campo, se esiste, e riempire usa un valore predefinito per quelli che non .. MODIFICA: – mgoetzke

2

Apparentemente ElasticSearch non eseguirà l'ordinamento su valori nulli. Supponevo che avrebbe trattato null come all'inizio o alla fine (come con l'ordinamento SQL), ma credo che faccia scattare anche questo errore.

Quindi, se viene visualizzato questo errore, potrebbe essere necessario assicurarsi che l'attributo sort abbia un valore predefinito quando viene inviato a ElasticSearch.

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

This issue indica che i valori nulli sono gestiti, ma non è stata la mia esperienza. È comunque qualcosa che vale la pena provare.

28

Per chi cerca un esempio di entrambi ignore_unmapped e unmapped_type vedere my response here.

Si noti che "ignore_unmapped" è ora deprecato a favore di "unmapped_type". Ciò è stato fatto come parte di #7039

From documentation: Prima 1.4.0 c'era il parametro booleano ignore_unmapped, che non era abbastanza informazioni per decidere sui valori di ordinamento per emettere, e non ha funzionato per la ricerca cross-index. È ancora supportato, ma gli utenti sono invitati a migrare al nuovo unmapped_type.

Per impostazione predefinita, la richiesta di ricerca avrà esito negativo se non vi è alcuna associazione associata a un campo. L'opzione unmapped_type consente di ignorare i campi che non hanno mapping e di non ordinare da 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 degli indici che vengono interrogati non dispone di una mappatura per prezzo allora elasticsearch tratteremo come se ci fosse una mappatura di tipo long, con tutti i documenti in questo indice non hanno valore per questo campo.

Problemi correlati