範囲フィールドタイプ
範囲フィールドタイプは、上限と下限の間の連続した値の範囲を表します。たとえば、範囲は 10月の任意の日付 または 0から9までの任意の整数 を表すことができます。これらは、下限に対して gt
または gte
を使用し、上限に対して lt
または lte
を使用して定義されます。クエリに使用でき、集計のサポートは限られています。サポートされている集計は、ヒストグラム、カーディナリティ のみです。
サポートされている範囲タイプは次のとおりです:
integer_range |
最小値が -231 で最大値が 231-1 の符号付き32ビット整数の範囲。 |
float_range |
単精度32ビットIEEE 754浮動小数点値の範囲。 |
long_range |
最小値が -263 で最大値が 263-1 の符号付き64ビット整数の範囲。 |
double_range |
倍精度64ビットIEEE 754浮動小数点値の範囲。 |
date_range |
date 値の範囲。日付範囲は、format マッピングパラメータを通じてさまざまな日付形式をサポートします。使用される形式に関係なく、日付値はUnixエポックからのミリ秒を表す符号なし64ビット整数に解析されます。now 日付数学 表現を含む値はサポートされていません。 |
ip_range |
IPv4 または IPv6(または混合)アドレスをサポートするIP値の範囲。 |
以下は、さまざまな範囲フィールドを使用してマッピングを構成する例と、いくつかの範囲タイプをインデックスする例です。
Python
resp = client.indices.create(
index="range_index",
settings={
"number_of_shards": 2
},
mappings={
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
},
)
print(resp)
resp1 = client.index(
index="range_index",
id="1",
refresh=True,
document={
"expected_attendees": {
"gte": 10,
"lt": 20
},
"time_frame": {
"gte": "2015-10-31 12:00:00",
"lte": "2015-11-01"
}
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'range_index',
body: {
settings: {
number_of_shards: 2
},
mappings: {
properties: {
expected_attendees: {
type: 'integer_range'
},
time_frame: {
type: 'date_range',
format: 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis'
}
}
}
}
)
puts response
response = client.index(
index: 'range_index',
id: 1,
refresh: true,
body: {
expected_attendees: {
gte: 10,
lt: 20
},
time_frame: {
gte: '2015-10-31 12:00:00',
lte: '2015-11-01'
}
}
)
puts response
Js
const response = await client.indices.create({
index: "range_index",
settings: {
number_of_shards: 2,
},
mappings: {
properties: {
expected_attendees: {
type: "integer_range",
},
time_frame: {
type: "date_range",
format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "range_index",
id: 1,
refresh: "true",
document: {
expected_attendees: {
gte: 10,
lt: 20,
},
time_frame: {
gte: "2015-10-31 12:00:00",
lte: "2015-11-01",
},
},
});
console.log(response1);
コンソール
PUT range_index
{
"settings": {
"number_of_shards": 2
},
"mappings": {
"properties": {
"expected_attendees": {
"type": "integer_range"
},
"time_frame": {
"type": "date_range",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"<br> }<br> }<br> }<br>}<br><br>PUT range_index/_doc/1?refresh<br>{<br> "expected_attendees" : {<br> "gte" : 10,<br> "lt" : 20<br> },<br> "time_frame" : {<br> "gte" : "2015-10-31 12:00:00",<br> "lte" : "2015-11-01"<br> }<br>}<br>``````<br><br>
| | |
| --- | --- |
| | `````date_range````` タイプは、[`````date`````](/read/elasticsearch-8-15/9dfa1da42eb162ff.md "日付フィールドタイプ") タイプによって定義された同じフィールドパラメータを受け入れます。 |
| | 20人を含まない10人から20人の出席者で会議をインデックスする例。 |
| | 日付タイムスタンプを使用した日付範囲の例。 |
以下は、`````integer_range````` フィールド名 "expected_attendees" に対する [タームクエリ](/read/elasticsearch-8-15/3a8fe9d13cce9d29.md) の例です。12は範囲内の値であるため、一致します。
#### Python
``````python
resp = client.search(
index="range_index",
query={
"term": {
"expected_attendees": {
"value": 12
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'range_index',
body: {
query: {
term: {
expected_attendees: {
value: 12
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "range_index",
query: {
term: {
expected_attendees: {
value: 12,
},
},
},
});
console.log(response);
コンソール
GET range_index/_search
{
"query" : {
"term" : {
"expected_attendees" : {
"value": 12
}
}
}
}
コンソール-結果
{
"took": 13,
"timed_out": false,
"_shards" : {
"total": 2,
"successful": 2,
"skipped" : 0,
"failed": 0
},
"hits" : {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "range_index",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"expected_attendees" : {
"gte" : 10, "lt" : 20
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
}
}
}
]
}
}
以下は、date_range
フィールド名 “time_frame” に対する date_range
クエリの例です。
Python
resp = client.search(
index="range_index",
query={
"range": {
"time_frame": {
"gte": "2015-10-31",
"lte": "2015-11-01",
"relation": "within"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'range_index',
body: {
query: {
range: {
time_frame: {
gte: '2015-10-31',
lte: '2015-11-01',
relation: 'within'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "range_index",
query: {
range: {
time_frame: {
gte: "2015-10-31",
lte: "2015-11-01",
relation: "within",
},
},
},
});
console.log(response);
コンソール
GET range_index/_search
{
"query" : {
"range" : {
"time_frame" : {
"gte" : "2015-10-31",
"lte" : "2015-11-01",
"relation" : "within"
}
}
}
}
範囲クエリは、範囲クエリ に記載されているのと同じように機能します。 | |
範囲 フィールド に対する範囲クエリは、relation パラメータをサポートし、WITHIN 、CONTAINS 、INTERSECTS (デフォルト)のいずれかになります。 |
コンソール-結果
{
"took": 13,
"timed_out": false,
"_shards" : {
"total": 2,
"successful": 2,
"skipped" : 0,
"failed": 0
},
"hits" : {
"total" : {
"value": 1,
"relation": "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "range_index",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"expected_attendees" : {
"gte" : 10, "lt" : 20
},
"time_frame" : {
"gte" : "2015-10-31 12:00:00", "lte" : "2015-11-01"
}
}
}
]
}
}
IP範囲
上記の範囲形式に加えて、IP範囲は CIDR 表記で提供できます:
Python
resp = client.indices.put_mapping(
index="range_index",
properties={
"ip_allowlist": {
"type": "ip_range"
}
},
)
print(resp)
resp1 = client.index(
index="range_index",
id="2",
document={
"ip_allowlist": "192.168.0.0/16"
},
)
print(resp1)
Ruby
response = client.indices.put_mapping(
index: 'range_index',
body: {
properties: {
ip_allowlist: {
type: 'ip_range'
}
}
}
)
puts response
response = client.index(
index: 'range_index',
id: 2,
body: {
ip_allowlist: '192.168.0.0/16'
}
)
puts response
Js
const response = await client.indices.putMapping({
index: "range_index",
properties: {
ip_allowlist: {
type: "ip_range",
},
},
});
console.log(response);
const response1 = await client.index({
index: "range_index",
id: 2,
document: {
ip_allowlist: "192.168.0.0/16",
},
});
console.log(response1);
コンソール
PUT range_index/_mapping
{
"properties": {
"ip_allowlist": {
"type": "ip_range"
}
}
}
PUT range_index/_doc/2
{
"ip_allowlist" : "192.168.0.0/16"
}
範囲フィールドのパラメータ
範囲タイプによって受け入れられるパラメータは次のとおりです:
coerce |
文字列を数値に変換し、整数の小数部分を切り捨てようとします。true (デフォルト)および false を受け入れます。 |
doc_values |
フィールドはディスクに列ストライド方式で保存されるべきですか?その後、ソート、集計、またはスクリプトに使用できますか?true (デフォルト)または false を受け入れます。 |
index |
フィールドは検索可能であるべきですか?true (デフォルト)および false を受け入れます。 |
store |
フィールド値は、_source フィールドから別々に保存および取得されるべきですか?true または false (デフォルト)を受け入れます。 |
合成 _source
合成 _source
は、一般的にTSDBインデックス(index.mode
が time_series
に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source
は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために作業しますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
range
フィールドは、デフォルト構成で 合成 _source
をサポートします。合成 _source
は、doc_values
が無効になっている場合には使用できません。
合成ソースは常に値をソートし、range
フィールドのすべての重複を削除しますが、ip_range
の場合は除きます。範囲は、下限でソートされ、その後上限でソートされます。たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"my_range": {
"type": "long_range"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"my_range": [
{
"gte": 200,
"lte": 300
},
{
"gte": 1,
"lte": 100
},
{
"gte": 200,
"lte": 300
},
{
"gte": 200,
"lte": 500
}
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
my_range: {
type: 'long_range'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
my_range: [
{
gte: 200,
lte: 300
},
{
gte: 1,
lte: 100
},
{
gte: 200,
lte: 300
},
{
gte: 200,
lte: 500
}
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
my_range: {
type: "long_range",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
my_range: [
{
gte: 200,
lte: 300,
},
{
gte: 1,
lte: 100,
},
{
gte: 200,
lte: 300,
},
{
gte: 200,
lte: 500,
},
],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"my_range": { "type": "long_range" }
}
}
}
PUT idx/_doc/1
{
"my_range": [
{
"gte": 200,
"lte": 300
},
{
"gte": 1,
"lte": 100
},
{
"gte": 200,
"lte": 300
},
{
"gte": 200,
"lte": 500
}
]
}
コンソール-結果
{
"my_range": [
{
"gte": 1,
"lte": 100
},
{
"gte": 200,
"lte": 300
},
{
"gte": 200,
"lte": 500
}
]
}
ip_range
フィールドの値はソートされませんが、元の順序は保持されません。重複した範囲は削除されます。ip_range
フィールド値がCIDRとして提供される場合、合成ソースではIPアドレスの範囲として表されます。
たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"my_range": {
"type": "ip_range"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"my_range": [
"10.0.0.0/24",
{
"gte": "10.0.0.0",
"lte": "10.0.0.255"
}
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
my_range: {
type: 'ip_range'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
my_range: [
'10.0.0.0/24',
{
gte: '10.0.0.0',
lte: '10.0.0.255'
}
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
my_range: {
type: "ip_range",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
my_range: [
"10.0.0.0/24",
{
gte: "10.0.0.0",
lte: "10.0.0.255",
},
],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"my_range": { "type": "ip_range" }
}
}
}
PUT idx/_doc/1
{
"my_range": [
"10.0.0.0/24",
{
"gte": "10.0.0.0",
"lte": "10.0.0.255"
}
]
}
コンソール-結果
{
"my_range": {
"gte": "10.0.0.0",
"lte": "10.0.0.255"
}
}
範囲フィールドの値は常に両側で包含的に表され、境界はそれに応じて調整されます。範囲境界のデフォルト値は null
として表されます。これは、範囲境界が明示的に提供された場合でも当てはまります。たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"my_range": {
"type": "long_range"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"my_range": {
"gt": 200,
"lt": 300
}
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
my_range: {
type: 'long_range'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
my_range: {
gt: 200,
lt: 300
}
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
my_range: {
type: "long_range",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
my_range: {
gt: 200,
lt: 300,
},
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"my_range": { "type": "long_range" }
}
}
}
PUT idx/_doc/1
{
"my_range": {
"gt": 200,
"lt": 300
}
}
コンソール-結果
{
"my_range": {
"gte": 201,
"lte": 299
}
}
範囲境界のデフォルト値は合成ソースで null
として表されます。これは、範囲境界がデフォルト値で明示的に提供された場合でも当てはまります。たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"my_range": {
"type": "integer_range"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"my_range": {
"lte": 2147483647
}
},
)
print(resp1)
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
my_range: {
type: "integer_range",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
my_range: {
lte: 2147483647,
},
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"my_range": { "type": "integer_range" }
}
}
}
PUT idx/_doc/1
{
"my_range": {
"lte": 2147483647
}
}
コンソール-結果
{
"my_range": {
"gte": null,
"lte": null
}
}
date
範囲は、提供された format
またはデフォルトで yyyy-MM-dd'T'HH:mm:ss.SSSZ
形式を使用してフォーマットされます。たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"my_range": {
"type": "date_range"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"my_range": [
{
"gte": 1504224000000,
"lte": 1504569600000
},
{
"gte": "2017-09-01",
"lte": "2017-09-10"
}
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
my_range: {
type: 'date_range'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
my_range: [
{
gte: 1_504_224_000_000,
lte: 1_504_569_600_000
},
{
gte: '2017-09-01',
lte: '2017-09-10'
}
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
my_range: {
type: "date_range",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
my_range: [
{
gte: 1504224000000,
lte: 1504569600000,
},
{
gte: "2017-09-01",
lte: "2017-09-10",
},
],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"my_range": { "type": "date_range" }
}
}
}
PUT idx/_doc/1
{
"my_range": [
{
"gte": 1504224000000,
"lte": 1504569600000
},
{
"gte": "2017-09-01",
"lte": "2017-09-10"
}
]
}
コンソール-結果
{
"my_range": [
{
"gte": "2017-09-01T00:00:00.000Z",
"lte": "2017-09-05T00:00:00.000Z"
},
{
"gte": "2017-09-01T00:00:00.000Z",
"lte": "2017-09-10T00:00:00.000Z"
}
]
}