Für das Feld wurde keine Zuordnung gefunden, um in ElasticSearch zu sortieren

117

Elasticsearch löst eine SearchParseExceptionAnalyse-Abfrage aus, wenn einige Dokumente gefunden wurden, die kein Feld enthalten, das in Sortierkriterien verwendet wird.

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

Wie kann ich diese Dokumente erfolgreich durchsuchen, auch wenn bei einigen das priceFeld fehlt ?

Yadu
quelle
1
Ihre Frage / Antwort hat mein Problem gelöst - danke. Ich habe es bearbeitet, um es etwas zu verallgemeinern. Wenn das nicht zu Ihnen passt, können Sie es gerne zurücksetzen.
Paul Bellora
1
Referenz zur Behandlung dieses Problems Elasticsearch Link
Ajeesh

Antworten:

116

Nachdem ich mehr gegraben hatte, fand ich die Lösung wie unten angegeben. ignore_unmappedsollte truein der Sortierklausel explizit auf gesetzt werden .

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

Weitere Informationen finden Sie in den Elasticsearch-Referenzen für:

Yadu
quelle
Hallo, ich habe das gleiche Problem und verstehe nicht, wie das funktioniert ... Die fehlenden Attribute und ignore_unmapped sollten zusammenarbeiten, oder? Wenn ich beispielsweise das Fehlen auf "_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 nicht über das Attribut verfügen.
c4k
Ich habe dieses Problem und "ignore_unmapped" funktioniert nicht, wenn Ihr _type leer ist (dh ohne dass ein Dokument indiziert ist).
Reinaldoluckman
7
Sieht aus wie die neue Strategie ist, unmapped_type
lukmdo
2
Meine Abfragen funktionierten immer bis heute, ohne Bibliotheken usw. zu aktualisieren, aber heute bekam ich den gleichen Fehler. Ich fügte jetzt hinzu "ignore_unmapped" : trueund es fing wieder an zu funktionieren, aber seltsam ist, was hinter den Kulissen passiert ist! Wer weiß! Wie auch immer, es funktioniert jetzt. +1
BentCoder
1
Kann jemand den Unterschied zwischen "vermisst" und "nicht zugeordnet" klären? Wird ein solches Feld für ein bestimmtes Feld als "fehlend" oder "nicht zugeordnet" behandelt, wenn einige Dokumente es haben, während andere dies nicht tun? Bedeutet "fehlt", dass sich das Feld im Dokument befindet, der entsprechende Wert jedoch null ist?
Sher10ck
43

Für diejenigen, die ein Beispiel für beides suchen ignore_unmappedund unmapped_typebitte meine Antwort hier sehen .

Beachten Sie, dass "ignore_unmapped" jetzt zugunsten von "unmapped_type" veraltet ist. Dies wurde als Teil von # 7039 durchgeführt

Aus der Dokumentation: Vor 1.4.0 gab es den booleschen Parameter ignore_unmapped, der nicht ausreichte, um über die auszustellenden Sortierwerte zu entscheiden, und der für die indexübergreifende Suche nicht funktionierte. Es wird weiterhin unterstützt, aber Benutzer werden aufgefordert, stattdessen auf den neuen unmapped_type zu migrieren.

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

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

Wenn einer der abgefragten Indizes keine Preiszuordnung hat, behandelt Elasticsearch diese so, als ob eine Zuordnung vom Typ long vorhanden wäre, wobei alle Dokumente in diesem Index keinen Wert für dieses Feld haben.

Navneet Kumar
quelle
3

Anscheinend sortiert ElasticSearch nicht nach Nullwerten. Ich ging davon aus, dass null am Anfang oder Ende behandelt werden würde (wie bei der SQL-Reihenfolge), aber ich glaube, dass es auch diesen Fehler auslöst.

Wenn dieser Fehler angezeigt wird, 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 und daher als null an ES gesendet wurde.

Dieses Problem weist darauf hin, dass Nullwerte verarbeitet werden, aber es war nicht meine Erfahrung. Es lohnt sich trotzdem, es zu versuchen.

Mahemoff
quelle
2

Ich hatte das gleiche Problem (sorta; würde einige Fehler, aber einige Ergebnisse erhalten), aber in meinem Fall wurde meine Suche im Stammverzeichnis ausgegeben (kein Index angegeben), und die Fehler, die ich erhielt, waren, weil die Suche / Reihenfolge auch war auf einen Kibana-Index schauen.

Dummer Fehler, aber vielleicht hilft das jemand anderem, der hier landet.

James Boutcher
quelle
Ich habe das gleiche Problem .. aber wenn ich ignoriere, nicht zugeordnet, bekomme ich überhaupt keine Sortierung, wenn ich die Wurzel suche ... dies schränkt die Möglichkeit ein, nach mir zu suchen, wenn ich den Index definieren muss ... ich möchte einfach alle Übereinstimmende Ergebnisse, die nach einem Feld sortiert werden sollen, falls vorhanden, und Ausfüllen verwenden einen Standard für diejenigen, die dies nicht
tun. BEARBEITEN
2

Elasticsearch 6.4

Geben Sie einfach den Index an und fertig in Kibana

VOR

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

NACH DEM

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

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

wenn Sie es verwenden 6.7

Probier diese

sort : ["title.keyword:desc"]
Khalid Skiod
quelle
Es hat mir geholfen - elastisch 7.3
mirik
0

Sie können auch ein Skript verwenden, das Ihnen Flexibilität bietet:

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

Wenn wir den folgenden Code verwenden, bei dem add_on das Datum ist, was passiert dann !! Attributtext wird analysiert, dh er wird beim Speichern in verschiedene Wörter aufgeteilt und ermöglicht die Freitextsuche nach einem oder mehreren Wörtern im Feld

Daher sind den Feldern "Text" und "Schlüsselwort" zugeordnet. Wenn wir also die Aggregation in der Abfrage verwenden müssen, benötigen wir den Feldwert im Allgemeinen das Schlüsselwort.

BEFORE

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

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Abhishek
quelle