1
0

expression.asciidoc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. [[modules-scripting-expression]]
  2. == Lucene expressions language
  3. Lucene's expressions compile a `javascript` expression to bytecode. They are
  4. designed for high-performance custom ranking and sorting functions and are
  5. enabled for `inline` and `stored` scripting by default.
  6. [float]
  7. === Performance
  8. Expressions were designed to have competitive performance with custom Lucene code.
  9. This performance is due to having low per-document overhead as opposed to other
  10. scripting engines: expressions do more "up-front".
  11. This allows for very fast execution, even faster than if you had written a `native` script.
  12. [float]
  13. === Syntax
  14. Expressions support a subset of javascript syntax: a single expression.
  15. See the link:http://lucene.apache.org/core/6_0_0/expressions/index.html?org/apache/lucene/expressions/js/package-summary.html[expressions module documentation]
  16. for details on what operators and functions are available.
  17. Variables in `expression` scripts are available to access:
  18. * document fields, e.g. `doc['myfield'].value`
  19. * variables and methods that the field supports, e.g. `doc['myfield'].empty`
  20. * Parameters passed into the script, e.g. `mymodifier`
  21. * The current document's score, `_score` (only available when used in a `script_score`)
  22. You can use Expressions scripts for `script_score`, `script_fields`, sort scripts, and numeric aggregation
  23. scripts, simply set the `lang` parameter to `expression`.
  24. [float]
  25. === Numeric field API
  26. [cols="<,<",options="header",]
  27. |=======================================================================
  28. |Expression |Description
  29. |`doc['field_name'].value` |The value of the field, as a `double`
  30. |`doc['field_name'].empty` |A boolean indicating if the field has no
  31. values within the doc.
  32. |`doc['field_name'].length` |The number of values in this document.
  33. |`doc['field_name'].min()` |The minimum value of the field in this document.
  34. |`doc['field_name'].max()` |The maximum value of the field in this document.
  35. |`doc['field_name'].median()` |The median value of the field in this document.
  36. |`doc['field_name'].avg()` |The average of the values in this document.
  37. |`doc['field_name'].sum()` |The sum of the values in this document.
  38. |=======================================================================
  39. When a document is missing the field completely, by default the value will be treated as `0`.
  40. You can treat it as another value instead, e.g. `doc['myfield'].empty ? 100 : doc['myfield'].value`
  41. When a document has multiple values for the field, by default the minimum value is returned.
  42. You can choose a different value instead, e.g. `doc['myfield'].sum()`.
  43. When a document is missing the field completely, by default the value will be treated as `0`.
  44. Boolean fields are exposed as numerics, with `true` mapped to `1` and `false` mapped to `0`.
  45. For example: `doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value`
  46. [float]
  47. === Date field API
  48. Date fields are treated as the number of milliseconds since January 1, 1970 and
  49. support the Numeric Fields API above, plus access to some date-specific fields:
  50. [cols="<,<",options="header",]
  51. |=======================================================================
  52. |Expression |Description
  53. |`doc['field_name'].date.centuryOfEra`|Century (1-2920000)
  54. |`doc['field_name'].date.dayOfMonth`|Day (1-31), e.g. `1` for the first of the month.
  55. |`doc['field_name'].date.dayOfWeek`|Day of the week (1-7), e.g. `1` for Monday.
  56. |`doc['field_name'].date.dayOfYear`|Day of the year, e.g. `1` for January 1.
  57. |`doc['field_name'].date.era`|Era: `0` for BC, `1` for AD.
  58. |`doc['field_name'].date.hourOfDay`|Hour (0-23).
  59. |`doc['field_name'].date.millisOfDay`|Milliseconds within the day (0-86399999).
  60. |`doc['field_name'].date.millisOfSecond`|Milliseconds within the second (0-999).
  61. |`doc['field_name'].date.minuteOfDay`|Minute within the day (0-1439).
  62. |`doc['field_name'].date.minuteOfHour`|Minute within the hour (0-59).
  63. |`doc['field_name'].date.monthOfYear`|Month within the year (1-12), e.g. `1` for January.
  64. |`doc['field_name'].date.secondOfDay`|Second within the day (0-86399).
  65. |`doc['field_name'].date.secondOfMinute`|Second within the minute (0-59).
  66. |`doc['field_name'].date.year`|Year (-292000000 - 292000000).
  67. |`doc['field_name'].date.yearOfCentury`|Year within the century (1-100).
  68. |`doc['field_name'].date.yearOfEra`|Year within the era (1-292000000).
  69. |=======================================================================
  70. The following example shows the difference in years between the `date` fields date0 and date1:
  71. `doc['date1'].date.year - doc['date0'].date.year`
  72. [float]
  73. [[geo-point-field-api]]
  74. === `geo_point` field API
  75. [cols="<,<",options="header",]
  76. |=======================================================================
  77. |Expression |Description
  78. |`doc['field_name'].empty` |A boolean indicating if the field has no
  79. values within the doc.
  80. |`doc['field_name'].lat` |The latitude of the geo point.
  81. |`doc['field_name'].lon` |The longitude of the geo point.
  82. |=======================================================================
  83. The following example computes distance in kilometers from Washington, DC:
  84. `haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)`
  85. In this example the coordinates could have been passed as parameters to the script,
  86. e.g. based on geolocation of the user.
  87. [float]
  88. === Limitations
  89. There are a few limitations relative to other script languages:
  90. * Only numeric, boolean, date, and geo_point fields may be accessed
  91. * Stored fields are not available