2013-06-11 4 views
69

Elasticsearch löst eine SearchParseException beim Analysieren der Abfrage aus, wenn Dokumente gefunden wurden, die kein in Sortierkriterien verwendetes Feld enthalten.Es wurde keine Zuordnung für das Feld gefunden, um nach ElasticSearch zu sortieren.

SearchParseException: Parsen Fehler [Keine Zuordnung für [Preis], um zu sortieren gefunden]

Wie kann ich erfolgreich diese Dokumente suchen, auch wenn einige das price Feld fehlen?

+1

Ihre Frage/Antwort hat mein Problem gelöst - danke. Ich habe es bearbeitet, um es etwas zu generalisieren, fühlen Sie sich frei Rollback, wenn das nicht zu Ihnen passt. –

+0

Referenz für die Handhabung dieses Problems [Elasticsearch Link] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html) – Ajeesh

Antwort

78

Nach dem Graben mehr, fand ich die Lösung wie unten angegeben. ignore_unmapped sollte in der Sortierklausel explizit auf true gesetzt werden.

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

Für weitere Informationen haben einen Blick auf die Elasticsearch Referenzen für:

+0

Hallo, ich habe das gleiche Problem und ich don verstehe nicht wie das funktioniert ... Die Attribute missing und ignore_unmapped sollten zusammen richtig funktionieren? Wenn ich beispielsweise "_last" und ignore_unmapped auf "false" setze, habe ich immer noch das Problem, aber ich möchte, dass die Dokumente in allen Fällen in den Ergebnissen enthalten sind, auch wenn sie das Attribut nicht haben. – c4k

+0

Ich habe dieses Problem und "ignore_unmapped" funktioniert nicht, wenn Ihr _type leer ist (d. H. Ohne Dokument indiziert). – reinaldoluckman

+2

Sieht aus wie die neue Strategie ist, [unmapped_type] zu verwenden (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-sort.html#_ignoring_unmapped_fields) – lukmdo

0

ich das gleiche Problem (sorta erlebt, würden einige Fehler, aber einige Ergebnisse), aber in meinem Fall wurde meine Suche an der Wurzel (kein Index angegeben), und die Fehler, die ich bekam, waren wegen der See rch/order suchte ebenfalls nach einem Kibana-Index.

Dummer Fehler, aber vielleicht hilft das jemand anderen, der hier endet.

+0

Ich habe das gleiche Problem .. aber wenn ich angeben ignoriere unmapped ich bekomme überhaupt keine Sortierung bei der Suche nach der Wurzel ... dies begrenzt die Fähigkeit, nach mir zu suchen, wenn ich den Index definieren muss ... ich würde einfach wollen alle übereinstimmenden Ergebnisse nach einem Feld sortiert werden, wenn es existiert, und füllen Sie einen Standard für diejenigen, die nicht .. EDIT: – mgoetzke

2

Scheinbar ElasticSearch wird nicht nach Nullwerten sortieren. Ich ging davon aus, dass es null als Anfang oder Ende behandeln würde (wie bei der SQL-Sortierung), aber ich glaube, es löst auch diesen Fehler aus.

Wenn Sie diesen Fehler sehen, müssen Sie möglicherweise sicherstellen, dass das Sortierattribut einen Standardwert hat, wenn es an ElasticSearch gesendet wird.

Ich hatte diesen Fehler mit Rails + ElasticSearch + Tire, weil die Sortierspalte keinen Standardwert hatte, also an ES als null gesendet wurde.

This issue zeigt Null-Werte sind Handhabung, aber es war nicht meine Erfahrung. Es ist etwas wert, es trotzdem zu versuchen.

28

Für diejenigen, die ein Beispiel für beide ignore_unmapped und unmapped_type siehe my response here.

Beachten Sie, dass "ignore_unmapped" jetzt zugunsten von "unmapped_type" veraltet ist. Dies wurde im Rahmen von #7039 getan

From documentation: Vor 1.4.0 gibt es die ignore_unmapped boolean Parameter, die nicht genügend Information über die Art Wert zu entscheiden, zu emittieren, und hat nicht funktioniert für Cross-Index-Suche. Es wird weiterhin unterstützt, aber Benutzer werden dazu ermutigt, stattdessen zu dem neuen unmapped_type zu migrieren.

Standardmäßig schlägt die Suchanforderung fehl, wenn keine Zuordnung zu einem Feld zugeordnet ist. Mit der Option unmapped_type können Felder ignoriert werden, die keine Zuordnung haben und nicht nach ihnen sortieren. Der Wert dieses Parameters wird verwendet, um zu bestimmen, welche Sortierwerte ausgegeben werden sollen.Hier ist ein Beispiel dafür, wie es verwendet werden kann:

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

Wenn einer der Indizes, die abgefragt werden nicht eine Zuordnung für den Preis niederschlägt, dann wird Elasticsearch es behandeln, als ob es eine Abbildung des Typs lang war, mit Alle Dokumente in diesem Index haben keinen Wert für dieses Feld.

Verwandte Themen