2016-07-14 2 views
0

Ich versuche, meinen Kopf herumzulegen, wie ES funktioniert, aber scheinen nicht erfolgreich zu sein. Ich möchte, dass JSON-Dateien gelesen werden und jedem Eintrag eine neue Eigenschaft hinzugefügt wird, indem ein Wert aus den vorhandenen berechnet wird. Was wäre die Syntax dafür? Ich kann nicht scheinen, die Informationen aus der Dokumentation zusammen zu bringen, um es zum Laufen zu bringen. Vielen Dank!Elasticsearch - Holen Sie sich eine neue Eigenschaft mit Berechnung in großen Mengen

Ich versuche unter /mystuff so etwas wie

POST /mystuff/1/_update 
{ 
"doc": { 
    "recency": (DateTime.now().getMillis() - doc['maxdate'].value)/(24*60*60*1000) 
    } 
} 

allen docs zu tun. (Diese obviusly funktioniert nicht.)

[EDIT] Beispieleingabe:

PUT /mystuff/1 
{ 
... 
    "maxdate": "2016-06-14", 
... 
} 

ES Version: 2.3.4

Antwort

1

Sie haben _update_by_query API von Elasticsearch zu verwenden, um mehr als ein Dokument zu aktualisieren . Sie können mehr darüber lesen here.

Ihr Code wird in Art und Weise folgt ändern

POST mystuff/_update_by_query 
{ 
    "script": { 
    "inline": "ctx._source.recency = (DateTime.now().getMillis() - DateTime.parse(ctx._source.maxdate).getMillis())/(24*60*60*1000)" 
    }, 
    "query": { 
    "match_all": { 
    } 
    } 
} 

Sie sollten für diese arbeiten Skript Inline- und Skript-Update aktiviert haben.

+0

Schön! wusste nicht, dass so etwas existiert: D –

+0

@VishalRao ist eine neue experimentelle API, aber funktioniert gut für mich, andere Weise wäre es, komplette Dokumente eins nach dem anderen zu aktualisieren. –

+0

Danke! Aus irgendeinem Grund bekomme ich dafür 'missing_method_error':' "Keine Signatur der Methode: java.lang.Long.minus() gilt für Argumenttypen: (java.lang.String) Werte: [2014-07-16] \ nMögliche Lösungen: minus (java.lang.Character), minus (java.lang.Number), plus (java.lang.String), find(), min (lang, lang), signum (lang) "'. Irgendeine Idee, wie man es löst? –

Verwandte Themen