Luceneの式言語

Luceneの式は、javascript式をバイトコードにコンパイルします。これらは、高性能のカスタムランキングおよびソート関数のために設計されており、デフォルトでinlineおよびstoredスクリプトが有効になっています。

パフォーマンス

式は、カスタムLuceneコードと競争力のあるパフォーマンスを持つように設計されています。このパフォーマンスは、他のスクリプトエンジンに対して低いドキュメントごとのオーバーヘッドを持つためです:式はより多くの「前処理」を行います。

これにより、非常に高速な実行が可能になり、nativeスクリプトを自分で書いた場合よりもさらに速くなります。

構文

式は、javascript構文のサブセットをサポートします:単一の式。

利用可能な演算子と関数の詳細については、式モジュールのドキュメントを参照してください。

  1. - ドキュメントフィールド、例:`````doc['myfield'].value
  • フィールドがサポートする変数とメソッド、例:doc['myfield'].empty
  • スクリプトに渡されるパラメータ、例:mymodifier
  • 現在のドキュメントのスコア、_scorescript_scoreで使用されている場合のみ利用可能)
  1. ## 数値フィールドAPI
  2. | | 説明 |
  3. | :-- | :-- |
  4. | `````doc['field_name'].value````` | フィールドの値、`````double`````として |
  5. | `````doc['field_name'].empty````` | ドキュメント内に値がないことを示すブール値。 |
  6. | `````doc['field_name'].length````` | このドキュメント内の値の数。 |
  7. | `````doc['field_name'].min()````` | このドキュメント内のフィールドの最小値。 |
  8. | `````doc['field_name'].max()````` | このドキュメント内のフィールドの最大値。 |
  9. | `````doc['field_name'].median()````` | このドキュメント内のフィールドの中央値。 |
  10. | `````doc['field_name'].avg()````` | このドキュメント内の値の平均。 |
  11. | `````doc['field_name'].sum()````` | このドキュメント内の値の合計。 |
  12. ドキュメントがフィールドを完全に欠落している場合、デフォルトでは値は`````0`````として扱われます。代わりに別の値として扱うこともできます、例:`````doc['myfield'].empty ? 100 : doc['myfield'].value`````
  13. ドキュメントがフィールドに対して複数の値を持つ場合、デフォルトでは最小値が返されます。代わりに別の値を選択することもできます、例:`````doc['myfield'].sum()`````
  14. ドキュメントがフィールドを完全に欠落している場合、デフォルトでは値は`````0`````として扱われます。
  15. ブールフィールドは数値として公開され、`````true``````````1`````にマッピングされ、`````false``````````0`````にマッピングされます。例えば:`````doc['on_sale'].value ? doc['price'].value * 0.5 : doc['price'].value`````
  16. ## 日付フィールドAPI
  17. 日付フィールドは、197011日からのミリ秒数として扱われ、上記の数値フィールドAPIをサポートし、いくつかの日付特有のフィールドへのアクセスもサポートします:
  18. | | 説明 |
  19. | :-- | :-- |
  20. | `````doc['field_name'].date.centuryOfEra````` | 世紀(1-2920000 |
  21. | `````doc['field_name'].date.dayOfMonth````` | 日(1-31)、例:月の最初の日の`````1````` |
  22. | `````doc['field_name'].date.dayOfWeek````` | 曜日(1-7)、例:月曜日の`````1````` |
  23. | `````doc['field_name'].date.dayOfYear````` | 年の日、例:11日の`````1````` |
  24. | `````doc['field_name'].date.era````` | 紀元:BCの場合は`````0`````ADの場合は`````1````` |
  25. | `````doc['field_name'].date.hourOfDay````` | 時間(0-23)。 |
  26. | `````doc['field_name'].date.millisOfDay````` | 日内のミリ秒(0-86399999)。 |
  27. | `````doc['field_name'].date.millisOfSecond````` | 秒内のミリ秒(0-999)。 |
  28. | `````doc['field_name'].date.minuteOfDay````` | 日内の分(0-1439)。 |
  29. | `````doc['field_name'].date.minuteOfHour````` | 時間内の分(0-59)。 |
  30. | `````doc['field_name'].date.monthOfYear````` | 年内の月(1-12)、例:1月の`````1````` |
  31. | `````doc['field_name'].date.secondOfDay````` | 日内の秒(0-86399)。 |
  32. | `````doc['field_name'].date.secondOfMinute````` | 分内の秒(0-59)。 |
  33. | `````doc['field_name'].date.year````` | 年(-292000000 - 292000000)。 |
  34. | `````doc['field_name'].date.yearOfCentury````` | 世紀内の年(1-100)。 |
  35. | `````doc['field_name'].date.yearOfEra````` | 紀元内の年(1-292000000)。 |
  36. 以下の例は、`````date`````フィールドの日付0と日付1の間の年の違いを示しています:
  37. `````doc['date1'].date.year - doc['date0'].date.year`````
  38. ## geo_pointフィールドAPI
  39. | | 説明 |
  40. | :-- | :-- |
  41. | `````doc['field_name'].empty````` | ドキュメント内に値がないことを示すブール値。 |
  42. | `````doc['field_name'].lat````` | ジオポイントの緯度。 |
  43. | `````doc['field_name'].lon````` | ジオポイントの経度。 |
  44. 以下の例は、ワシントンDCからの距離をキロメートルで計算します:
  45. `````haversin(38.9072, 77.0369, doc['field_name'].lat, doc['field_name'].lon)

この例では、座標はスクリプトにパラメータとして渡される可能性がありました。例:ユーザーのジオロケーションに基づいて。

制限事項

他のスクリプト言語に対するいくつかの制限があります:

  • 数値、booleandate、およびgeo_pointフィールドのみがアクセス可能です。
  • ストレージフィールドは利用できません。