Luceneの式言語
Luceneの式は、javascript
式をバイトコードにコンパイルします。これらは、高性能のカスタムランキングおよびソート関数のために設計されており、デフォルトでinline
およびstored
スクリプトが有効になっています。
パフォーマンス
式は、カスタムLuceneコードと競争力のあるパフォーマンスを持つように設計されています。このパフォーマンスは、他のスクリプトエンジンに対して低いドキュメントごとのオーバーヘッドを持つためです:式はより多くの「前処理」を行います。
これにより、非常に高速な実行が可能になり、native
スクリプトを自分で書いた場合よりもさらに速くなります。
構文
式は、javascript構文のサブセットをサポートします:単一の式。
利用可能な演算子と関数の詳細については、式モジュールのドキュメントを参照してください。
- ドキュメントフィールド、例:`````doc['myfield'].value
- フィールドがサポートする変数とメソッド、例:
doc['myfield'].empty
- スクリプトに渡されるパラメータ、例:
mymodifier
- 現在のドキュメントのスコア、
_score
(script_score
で使用されている場合のみ利用可能)
## 数値フィールドAPI
| 式 | 説明 |
| :-- | :-- |
| `````doc['field_name'].value````` | フィールドの値、`````double`````として |
| `````doc['field_name'].empty````` | ドキュメント内に値がないことを示すブール値。 |
| `````doc['field_name'].length````` | このドキュメント内の値の数。 |
| `````doc['field_name'].min()````` | このドキュメント内のフィールドの最小値。 |
| `````doc['field_name'].max()````` | このドキュメント内のフィールドの最大値。 |
| `````doc['field_name'].median()````` | このドキュメント内のフィールドの中央値。 |
| `````doc['field_name'].avg()````` | このドキュメント内の値の平均。 |
| `````doc['field_name'].sum()````` | このドキュメント内の値の合計。 |
ドキュメントがフィールドを完全に欠落している場合、デフォルトでは値は`````0`````として扱われます。代わりに別の値として扱うこともできます、例:`````doc['myfield'].empty ? 100 : doc['myfield'].value`````。
ドキュメントがフィールドに対して複数の値を持つ場合、デフォルトでは最小値が返されます。代わりに別の値を選択することもできます、例:`````doc['myfield'].sum()`````。
ドキュメントがフィールドを完全に欠落している場合、デフォルトでは値は`````0`````として扱われます。
ブールフィールドは数値として公開され、`````true`````は`````1`````にマッピングされ、`````false`````は`````0`````にマッピングされます。例えば:`````doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value`````。
## 日付フィールドAPI
日付フィールドは、1970年1月1日からのミリ秒数として扱われ、上記の数値フィールドAPIをサポートし、いくつかの日付特有のフィールドへのアクセスもサポートします:
| 式 | 説明 |
| :-- | :-- |
| `````doc['field_name'].date.centuryOfEra````` | 世紀(1-2920000) |
| `````doc['field_name'].date.dayOfMonth````` | 日(1-31)、例:月の最初の日の`````1`````。 |
| `````doc['field_name'].date.dayOfWeek````` | 曜日(1-7)、例:月曜日の`````1`````。 |
| `````doc['field_name'].date.dayOfYear````` | 年の日、例:1月1日の`````1`````。 |
| `````doc['field_name'].date.era````` | 紀元:BCの場合は`````0`````、ADの場合は`````1`````。 |
| `````doc['field_name'].date.hourOfDay````` | 時間(0-23)。 |
| `````doc['field_name'].date.millisOfDay````` | 日内のミリ秒(0-86399999)。 |
| `````doc['field_name'].date.millisOfSecond````` | 秒内のミリ秒(0-999)。 |
| `````doc['field_name'].date.minuteOfDay````` | 日内の分(0-1439)。 |
| `````doc['field_name'].date.minuteOfHour````` | 時間内の分(0-59)。 |
| `````doc['field_name'].date.monthOfYear````` | 年内の月(1-12)、例:1月の`````1`````。 |
| `````doc['field_name'].date.secondOfDay````` | 日内の秒(0-86399)。 |
| `````doc['field_name'].date.secondOfMinute````` | 分内の秒(0-59)。 |
| `````doc['field_name'].date.year````` | 年(-292000000 - 292000000)。 |
| `````doc['field_name'].date.yearOfCentury````` | 世紀内の年(1-100)。 |
| `````doc['field_name'].date.yearOfEra````` | 紀元内の年(1-292000000)。 |
以下の例は、`````date`````フィールドの日付0と日付1の間の年の違いを示しています:
`````doc['date1'].date.year - doc['date0'].date.year`````。
## geo_pointフィールドAPI
| 式 | 説明 |
| :-- | :-- |
| `````doc['field_name'].empty````` | ドキュメント内に値がないことを示すブール値。 |
| `````doc['field_name'].lat````` | ジオポイントの緯度。 |
| `````doc['field_name'].lon````` | ジオポイントの経度。 |
以下の例は、ワシントンDCからの距離をキロメートルで計算します:
`````haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)
この例では、座標はスクリプトにパラメータとして渡される可能性がありました。例:ユーザーのジオロケーションに基づいて。
制限事項
他のスクリプト言語に対するいくつかの制限があります:
- 数値、
boolean
、date
、およびgeo_point
フィールドのみがアクセス可能です。 - ストレージフィールドは利用できません。