2017-12-18 1 views
1

Ich möchte alle Dokumente im Index aktualisieren. Ich habe festgestellt, dass die Aktualisierungsabfrage die Methode ist, die wir verwenden sollten. Aber ich stehe vor einem Problem, wenn ich ctx._now als Wert für das Feld des aktualisierten Dokuments verwende, wodurch der Feldwert null wird.Elasticsearch Update von Abfrage mit CTX

Dies ist die Probe:

{ 
 
    "script": { 
 
    "inline": "ctx._source.timenow = ctx._now" 
 
    }, 
 
    "query": { 
 
    "match_all": {} 
 
    } 
 
}

timenow evidence

Wenn ich Zufallszahlenwert verwende, ist es Arbeit. Nehmen wir an, dass ich tifenow = 5 setze. Dann werden alle Dokumente field timenow 5. Aber es ist nicht Arbeit mit dieser ctx-Methode.

Wie soll ich das tun?

Weitere Informationen

Das ist mein ES Informationen:

"version" : { 
 
    "number" : "5.5.1", 
 
    "build_hash" : "19c13d0", 
 
    "build_date" : "2017-07-18T20:44:24.823Z", 
 
    "build_snapshot" : false, 
 
    "lucene_version" : "6.6.0" 
 
    }

ich ctx._now verwende, weil es Arbeit auf dem Dokument Update ist. Hier ist der Fall:

{ 
 
    "script": "ctx._source.timenow2 = ctx._now" 
 
}

Beispiel: POST index/Typ/24/_update

hier die Dokumente von elastisch sind:

Neben _Source, Die folgenden Variablen sind über die ctx-Map verfügbar: _index, _type, _id, _version, _routing und _now (der aktuelle Zeitstempel).

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html

danken Ihnen

+0

wo hast du 'ctx._now' sehen? Welche Version von ES verwenden Sie? – Val

+0

Wenn alle Ihre Tuenows auf null aktualisiert werden, bedeutet das, dass '_now' kein Feld auf' ctx' ist. Wofür hast du "_now" benutzt (wo findest du Informationen darüber)? Versuchen Sie, die 'timenow'-Werte auf 'Instant.now()' oder so einzustellen, um zu sehen, wie das funktioniert. – ryanlutgen

+0

Ich habe Update meine Frage ctx._now hinzufügen. Wie kann ich Instant.now() verwenden? –

Antwort

1

_now nur in der Update-API ist, das heißt, wenn Sie die _update Endpunkt nennen, nicht _update_by_query.

Verwenden Sie stattdessen:

{ 
    "script": { 
    "inline": "ctx._source.timenow = Instant.now().toEpochMilli()" 
    }, 
    "query": { 
    "match_all": {} 
    } 
} 
+0

Danke, was schneller ist Instant.now oder new Date(). GetTime()? Ich habe ein neues Date(). GetTime() auf einer anderen Seite gefunden. –

+0

Das schnellste ist 'System.currentTimeMillis()' was 'Instant.now()' verwendet unter – Val

+0

Hi, ich habe es versucht und es funktioniert so gut. Vielen Dank –