mirror of
https://github.com/elastic/elasticsearch.git
synced 2025-06-28 17:34:17 -04:00
Expose multi-valued dates to scripts and document painless's date functions (#22875)
Implemented by wrapping an array of reused `ModuleDateTime`s that we grow when needed. The `ModuleDateTime`s are reused when we move to the next document. Also improves the error message returned when attempting to modify the `ScriptdocValues`, removes a couple of allocations, and documents that the date functions are available in Painless. Relates to #22162
This commit is contained in:
parent
7f59bed87b
commit
dacc150934
9 changed files with 405 additions and 66 deletions
|
@ -39,27 +39,27 @@ To illustrate how Painless works, let's load some hockey stats into an Elasticse
|
|||
----------------------------------------------------------------
|
||||
PUT hockey/player/_bulk?refresh
|
||||
{"index":{"_id":1}}
|
||||
{"first":"johnny","last":"gaudreau","goals":[9,27,1],"assists":[17,46,0],"gp":[26,82,1]}
|
||||
{"first":"johnny","last":"gaudreau","goals":[9,27,1],"assists":[17,46,0],"gp":[26,82,1],"born":"1993/08/13"}
|
||||
{"index":{"_id":2}}
|
||||
{"first":"sean","last":"monohan","goals":[7,54,26],"assists":[11,26,13],"gp":[26,82,82]}
|
||||
{"first":"sean","last":"monohan","goals":[7,54,26],"assists":[11,26,13],"gp":[26,82,82],"born":"1994/10/12"}
|
||||
{"index":{"_id":3}}
|
||||
{"first":"jiri","last":"hudler","goals":[5,34,36],"assists":[11,62,42],"gp":[24,80,79]}
|
||||
{"first":"jiri","last":"hudler","goals":[5,34,36],"assists":[11,62,42],"gp":[24,80,79],"born":"1984/01/04"}
|
||||
{"index":{"_id":4}}
|
||||
{"first":"micheal","last":"frolik","goals":[4,6,15],"assists":[8,23,15],"gp":[26,82,82]}
|
||||
{"first":"micheal","last":"frolik","goals":[4,6,15],"assists":[8,23,15],"gp":[26,82,82],"born":"1988/02/17"}
|
||||
{"index":{"_id":5}}
|
||||
{"first":"sam","last":"bennett","goals":[5,0,0],"assists":[8,1,0],"gp":[26,1,0]}
|
||||
{"first":"sam","last":"bennett","goals":[5,0,0],"assists":[8,1,0],"gp":[26,1,0],"born":"1996/06/20"}
|
||||
{"index":{"_id":6}}
|
||||
{"first":"dennis","last":"wideman","goals":[0,26,15],"assists":[11,30,24],"gp":[26,81,82]}
|
||||
{"first":"dennis","last":"wideman","goals":[0,26,15],"assists":[11,30,24],"gp":[26,81,82],"born":"1983/03/20"}
|
||||
{"index":{"_id":7}}
|
||||
{"first":"david","last":"jones","goals":[7,19,5],"assists":[3,17,4],"gp":[26,45,34]}
|
||||
{"first":"david","last":"jones","goals":[7,19,5],"assists":[3,17,4],"gp":[26,45,34],"born":"1984/08/10"}
|
||||
{"index":{"_id":8}}
|
||||
{"first":"tj","last":"brodie","goals":[2,14,7],"assists":[8,42,30],"gp":[26,82,82]}
|
||||
{"first":"tj","last":"brodie","goals":[2,14,7],"assists":[8,42,30],"gp":[26,82,82],"born":"1990/06/07"}
|
||||
{"index":{"_id":39}}
|
||||
{"first":"mark","last":"giordano","goals":[6,30,15],"assists":[3,30,24],"gp":[26,60,63]}
|
||||
{"first":"mark","last":"giordano","goals":[6,30,15],"assists":[3,30,24],"gp":[26,60,63],"born":"1983/10/03"}
|
||||
{"index":{"_id":10}}
|
||||
{"first":"mikael","last":"backlund","goals":[3,15,13],"assists":[6,24,18],"gp":[26,82,82]}
|
||||
{"first":"mikael","last":"backlund","goals":[3,15,13],"assists":[6,24,18],"gp":[26,82,82],"born":"1989/03/17"}
|
||||
{"index":{"_id":11}}
|
||||
{"first":"joe","last":"colborne","goals":[3,18,13],"assists":[6,20,24],"gp":[26,67,82]}
|
||||
{"first":"joe","last":"colborne","goals":[3,18,13],"assists":[6,20,24],"gp":[26,67,82],"born":"1990/01/30"}
|
||||
----------------------------------------------------------------
|
||||
// CONSOLE
|
||||
// TESTSETUP
|
||||
|
@ -194,6 +194,40 @@ POST hockey/player/1/_update
|
|||
----------------------------------------------------------------
|
||||
// CONSOLE
|
||||
|
||||
[float]
|
||||
[[modules-scripting-painless-dates]]
|
||||
=== Regular expressions
|
||||
|
||||
Dates are a little different to work with than regular values. Here is an
|
||||
example returning the year of every player's birth:
|
||||
|
||||
[source,js]
|
||||
----------------------------------------------------------------
|
||||
GET hockey/_search
|
||||
{
|
||||
"script_fields": {
|
||||
"birth_year": {
|
||||
"script": {
|
||||
"inline": "doc.born.date.year"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
----------------------------------------------------------------
|
||||
// CONSOLE
|
||||
|
||||
The key here is that instead of indexing directly into `doc.born` like you would
|
||||
a normal field you have to call `doc.born.date` to get a
|
||||
<<painless-api-reference-org-joda-time-ReadableDateTime, `ReadableDateTime`>>.
|
||||
From there you can call methods like
|
||||
<<painless-api-reference-org-joda-time-ReadableDateTime-getYear-0, `getYear`>>,
|
||||
and <<painless-api-reference-org-joda-time-ReadableDateTime-getDayOfWeek-0, `getDayOfWeek`>>.
|
||||
In the example above `year` is a shortcut to `getYear()`.
|
||||
|
||||
If the date field is a list then `date` will always return the first date. To
|
||||
access all the dates use `dates` instead of `date`.
|
||||
|
||||
|
||||
[float]
|
||||
[[modules-scripting-painless-regex]]
|
||||
=== Regular expressions
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue