範囲クエリ

指定された範囲内の用語を含むドキュメントを返します。

例リクエスト

次の検索は、age フィールドが 1020 の間の用語を含むドキュメントを返します。

Python

  1. resp = client.search(
  2. query={
  3. "range": {
  4. "age": {
  5. "gte": 10,
  6. "lte": 20,
  7. "boost": 2
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. range: {
  5. age: {
  6. gte: 10,
  7. lte: 20,
  8. boost: 2
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "range": {
  5. "age": {
  6. "gte": 10,
  7. "lte": 20,
  8. "boost": 2.0
  9. }
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. range: {
  4. age: {
  5. gte: 10,
  6. lte: 20,
  7. boost: 2,
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "range": {
  5. "age": {
  6. "gte": 10,
  7. "lte": 20,
  8. "boost": 2.0
  9. }
  10. }
  11. }
  12. }

範囲のトップレベルパラメータ

  • <field>
  • (必須、オブジェクト) 検索したいフィールド。

のパラメータ

  • gt
  • (オプション)より大きい。
  • gte
  • (オプション)以上。
  • lt
  • (オプション)より小さい。
  • lte
  • (オプション)以下。
  • format
  • (オプション、文字列)クエリ内の date 値を変換するために使用される日付形式。
    デフォルトでは、Elasticsearch は <field> のマッピングで提供された date format を使用します。この値はそのマッピング形式を上書きします。
    有効な構文については、format を参照してください。
    形式または日付値が不完全な場合、範囲クエリは欠落しているコンポーネントをデフォルト値で置き換えます。 欠落した日付コンポーネントを参照してください。

  • relation
  • (オプション、文字列)range フィールドの値に対して範囲クエリがどのように一致するかを示します。有効な値は次のとおりです:
    • INTERSECTS (デフォルト)
    • クエリの範囲と交差する範囲フィールド値を持つドキュメントと一致します。
    • CONTAINS
    • クエリの範囲を完全に含む範囲フィールド値を持つドキュメントと一致します。
    • WITHIN
    • クエリの範囲内に完全にある範囲フィールド値を持つドキュメントと一致します。
  • time_zone
  • (オプション、文字列)date 値を UTC に変換するために使用される 協定世界時 (UTC) オフセット または IANA タイムゾーン
    有効な値は、+01:00 や -08:00 のような ISO 8601 UTC オフセット、および America/Los_Angeles のような IANA タイムゾーン ID です。
    time_zone パラメータを使用した例のクエリについては、range クエリのタイムゾーンを参照してください。
    time_zone パラメータは、now日付計算 値に影響を与えません。 now は常に UTC の現在のシステム時間です。
    ただし、time_zone パラメータは、now および 日付計算の丸め を使用して計算された日付を変換します。たとえば、time_zone パラメータは now/d の値を変換します。
  • boost
  • (オプション、浮動小数点数) クエリの関連スコアを減少または増加させるために使用される浮動小数点数。デフォルトは1.0です。
    boostパラメータを使用して、2つ以上のクエリを含む検索の関連スコアを調整できます。
    ブースト値は 1.0 のデフォルト値に対して相対的です。 01.0 の間のブースト値は関連性スコアを減少させます。 1.0 より大きい値は関連性スコアを増加させます。

ノート

テキストおよびキーワードフィールドでの範囲クエリの使用

text または keyword フィールドに対する範囲クエリは、search.allow_expensive_queries が false に設定されている場合、実行されません。

日付フィールドでの範囲クエリの使用

<field> パラメータが date フィールドデータ型である場合、次のパラメータを使用して 日付計算 を使用できます:

  • gt
  • gte
  • lt
  • lte

たとえば、次の検索は、timestamp フィールドが今日と昨日の間の日付を含むドキュメントを返します。

Python

  1. resp = client.search(
  2. query={
  3. "range": {
  4. "timestamp": {
  5. "gte": "now-1d/d",
  6. "lte": "now/d"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. range: {
  5. timestamp: {
  6. gte: 'now-1d/d',
  7. lte: 'now/d'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. range: {
  4. timestamp: {
  5. gte: "now-1d/d",
  6. lte: "now/d",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "range": {
  5. "timestamp": {
  6. "gte": "now-1d/d",
  7. "lte": "now/d"
  8. }
  9. }
  10. }
  11. }

欠落した日付コンポーネント

範囲クエリおよび 日付範囲 集約に対して、Elasticsearch は欠落した日付コンポーネントを次の値で置き換えます。欠落した年のコンポーネントは置き換えられません。

テキスト

  1. MONTH_OF_YEAR: 01
  2. DAY_OF_MONTH: 01
  3. HOUR_OF_DAY: 23
  4. MINUTE_OF_HOUR: 59
  5. SECOND_OF_MINUTE: 59
  6. NANO_OF_SECOND: 999_999_999

例えば、形式が yyyy-MM の場合、Elasticsearch は gt の値 2099-122099-12-01T23:59:59.999_999_999Z に変換します。この日付は提供された年(2099)と月(12)を使用しますが、デフォルトの日(01)、時間(23)、分(59)、秒(59)、およびナノ秒(999_999_999)を使用します。

数値日付範囲値

日付形式が指定されておらず、範囲クエリが日付フィールドを対象としている場合、数値値はエポックからのミリ秒を表すものとして解釈されます。値が年を表すようにしたい場合(例:2020)、それを文字列値(例:”2020”)として渡す必要があります。これはデフォルト形式または設定された形式に従って解析されます。

日付計算と丸め

Elasticsearch は、パラメータ内の 日付計算 値を次のように丸めます:

  • gt
  • 丸められた日付でカバーされていない最初のミリ秒に切り上げます。
    たとえば、2014-11-18||/M2014-12-01T00:00:00.000 に切り上げられ、11月全体は除外されます。
  • gte
  • 最初のミリ秒に切り下げます。
    たとえば、2014-11-18||/M2014-11-01T00:00:00.000 に切り下げられ、全月が含まれます。
  • lt
  • 丸められた値の前の最後のミリ秒に切り下げます。
    たとえば、2014-11-18||/M2014-10-31T23:59:59.999 に切り下げられ、11月全体は除外されます。
  • lte
  • 丸めの間隔内の最新のミリ秒に切り上げます。
    たとえば、2014-11-18||/M2014-11-30T23:59:59.999 に切り上げられ、全月が含まれます。

time_zone パラメータを使用した例クエリ

time_zone パラメータを使用して、date 値を UTC オフセットを使用して UTC に変換できます。たとえば:

Php

  1. $params = [
  2. 'body' => [
  3. 'query' => [
  4. 'range' => [
  5. 'timestamp' => [
  6. 'time_zone' => '+01:00',
  7. 'gte' => '2020-01-01T00:00:00',
  8. 'lte' => 'now',
  9. ],
  10. ],
  11. ],
  12. ],
  13. ];
  14. $response = $client->search($params);

Python

  1. resp = client.search(
  2. query={
  3. "range": {
  4. "timestamp": {
  5. "time_zone": "+01:00",
  6. "gte": "2020-01-01T00:00:00",
  7. "lte": "now"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. range: {
  5. timestamp: {
  6. time_zone: '+01:00',
  7. gte: '2020-01-01T00:00:00',
  8. lte: 'now'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Go

  1. res, err := es.Search(
  2. es.Search.WithBody(strings.NewReader(`{
  3. "query": {
  4. "range": {
  5. "timestamp": {
  6. "time_zone": "+01:00",
  7. "gte": "2020-01-01T00:00:00",
  8. "lte": "now"
  9. }
  10. }
  11. }
  12. }`)),
  13. es.Search.WithPretty(),
  14. )
  15. fmt.Println(res, err)

Js

  1. const response = await client.search({
  2. query: {
  3. range: {
  4. timestamp: {
  5. time_zone: "+01:00",
  6. gte: "2020-01-01T00:00:00",
  7. lte: "now",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /_search
  2. {
  3. "query": {
  4. "range": {
  5. "timestamp": {
  6. "time_zone": "+01:00",
  7. "gte": "2020-01-01T00:00:00",
  8. "lte": "now"
  9. }
  10. }
  11. }
  12. }
date 値が +01:00 の UTC オフセットを使用することを示します。
UTC オフセットが +01:00 の場合、Elasticsearch はこの日付を
2019-12-31T23:00:00 UTC に変換します。
time_zone パラメータは now 値に影響を与えません。