Elasticsearch: Nullwertfelder in custom_score-Abfragen verursachen „Kein Feld“-Fehler

Erstellt am 9. Feb. 2011  ·  5Kommentare  ·  Quelle: elastic/elasticsearch

Es scheint ein Problem zu geben, wenn Sie custom_score-Abfragen verwenden und versuchen, basierend auf Feldern zu punkten, die Nullwerte enthalten können.

Da ich habe:

{"user": {"name": "John", "position": null}}

Wenn ich mit einem custom_score und einem Skript wie:

{"script": "_score + doc['position'].value"}

Ich bekomme folgenden Fehler:

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

Wenn ich einen anderen Benutzer hinzufüge:

{"user": {"name": "Jane", "position": 1}}

Alles funktioniert gut.

Ich denke, das Standardverhalten sollte sein, dass Nullwertfelder null zurückgeben - und keinen Fehler auslösen.

Die obigen Beispiele mögen lahm erscheinen, aber stellen Sie sich vor, Sie würden die Indizes mit Daten aus einer Datenbank füllen, bei der nicht garantiert werden kann, dass eine Spalte nichts anderes als Nullwerte enthält. Sie können dies umgehen, indem Sie Ihre Felder mithilfe von Mapping in Zeichenfolgen umwandeln, aber ich schlage definitiv vor, dass ElasticSearch den Skriptwert intelligenter handhaben kann.

Hilfreichster Kommentar

Das sollte funktionieren:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Oder vielleicht sogar das:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Trotzdem sollten Sie bei ausreichendem Datensatz, bei dem mindestens ein Dokument auf jedem Shard einen Wert von position hat, diese Überprüfung nicht benötigen, und dann wird die Leistung Ihres Skripts viel besser sein.

Alle 5 Kommentare

Oh - und danke für ein tolles Produkt! :-)

Hey,

Dies geschieht, weil dieses Feld noch nicht eingeführt wurde (es hat einen Nullwert). Sobald es (mit einem einzigen Wert in den Cluster) eingeführt wurde, funktioniert es einwandfrei. Sie können auch null-value in den Zuordnungen definieren, die einen bestimmten Nullwert indizieren, wenn dieses Feld null ist. Da es nicht eingeführt wurde, kann sein Typ nicht abgeleitet werden.

Ja ich verstehe das. Wäre es nicht besser für den Skriptwert, null zurückzugeben oder zumindest eine Funktion zu haben, die auf seine Existenz überprüft, anstatt eine Ausnahme auszulösen und zu bewirken, dass keine Ergebnisse zurückgegeben werden?

Z.B:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

Das sollte funktionieren:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Oder vielleicht sogar das:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Trotzdem sollten Sie bei ausreichendem Datensatz, bei dem mindestens ein Dokument auf jedem Shard einen Wert von position hat, diese Überprüfung nicht benötigen, und dann wird die Leistung Ihres Skripts viel besser sein.

Schwerwiegender Fehler: Uncaught [NoFieldFound]Kein Feld gefunden: Contact._PloiciesLastApplicationDate0 Versucht: 1 Mal(e). geworfen

Beim Aktualisieren des Kontakts erhalte ich die folgende Fehlermeldung.

zum Beispiel:-

$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));

Ich rufe den Kontakt ab und aktualisiere den Kontakt basierend auf der Telefonnummer, aber es wird dieser Fehler angezeigt?

Danke!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen