符号なしの長整数フィールドタイプ
符号なしの長整数は、最小値が0で最大値が264-1
(0から18446744073709551615まで含む)の符号なし64ビット整数を表す数値フィールドタイプです。
Python
resp = client.indices.create(
index="my_index",
mappings={
"properties": {
"my_counter": {
"type": "unsigned_long"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my_index',
body: {
mappings: {
properties: {
my_counter: {
type: 'unsigned_long'
}
}
}
}
)
puts response
Js
const response = await client.indices.create({
index: "my_index",
mappings: {
properties: {
my_counter: {
type: "unsigned_long",
},
},
},
});
console.log(response);
コンソール
PUT my_index
{
"mappings": {
"properties": {
"my_counter": {
"type": "unsigned_long"
}
}
}
}
符号なしの長整数は、数値または文字列形式でインデックス化でき、範囲[0, 18446744073709551615]の整数値を表します。小数部分を持つことはできません。
Python
resp = client.bulk(
index="my_index",
refresh=True,
operations=[
{
"index": {
"_id": 1
}
},
{
"my_counter": 0
},
{
"index": {
"_id": 2
}
},
{
"my_counter": 9223372036854776000
},
{
"index": {
"_id": 3
}
},
{
"my_counter": 18446744073709552000
},
{
"index": {
"_id": 4
}
},
{
"my_counter": 18446744073709552000
}
],
)
print(resp)
Ruby
response = client.bulk(
index: 'my_index',
refresh: true,
body: [
{
index: {
_id: 1
}
},
{
my_counter: 0
},
{
index: {
_id: 2
}
},
{
my_counter: 9_223_372_036_854_776_000
},
{
index: {
_id: 3
}
},
{
my_counter: 18_446_744_073_709_552_000
},
{
index: {
_id: 4
}
},
{
my_counter: 18_446_744_073_709_552_000
}
]
)
puts response
Js
const response = await client.bulk({
index: "my_index",
refresh: "true",
operations: [
{
index: {
_id: 1,
},
},
{
my_counter: 0,
},
{
index: {
_id: 2,
},
},
{
my_counter: 9223372036854776000,
},
{
index: {
_id: 3,
},
},
{
my_counter: 18446744073709552000,
},
{
index: {
_id: 4,
},
},
{
my_counter: 18446744073709552000,
},
],
});
console.log(response);
コンソール
POST /my_index/_bulk?refresh
{"index":{"_id":1}}
{"my_counter": 0}
{"index":{"_id":2}}
{"my_counter": 9223372036854775808}
{"index":{"_id":3}}
{"my_counter": 18446744073709551614}
{"index":{"_id":4}}
{"my_counter": 18446744073709551615}
タームクエリは、数値または文字列形式の任意の数値を受け入れます。
Python
resp = client.search(
index="my_index",
query={
"term": {
"my_counter": 18446744073709552000
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_index',
body: {
query: {
term: {
my_counter: 18_446_744_073_709_552_000
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_index",
query: {
term: {
my_counter: 18446744073709552000,
},
},
});
console.log(response);
コンソール
GET /my_index/_search
{
"query": {
"term" : {
"my_counter" : 18446744073709551615
}
}
}
範囲クエリのタームは小数部分を含む値を持つことができます。この場合、Elasticsearchはそれらを整数値に変換します:gte
およびgt
のタームは、上限を含む最も近い整数に変換され、lt
およびlte
の範囲は、下限を含む最も近い整数に変換されます。
精度の損失なく解析されることを保証するために、範囲を文字列として渡すことをお勧めします。
Python
resp = client.search(
index="my_index",
query={
"range": {
"my_counter": {
"gte": "9223372036854775808",
"lte": "18446744073709551615"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_index',
body: {
query: {
range: {
my_counter: {
gte: '9223372036854775808',
lte: '18446744073709551615'
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_index",
query: {
range: {
my_counter: {
gte: "9223372036854775808",
lte: "18446744073709551615",
},
},
},
});
console.log(response);
コンソール
GET /my_index/_search
{
"query": {
"range" : {
"my_counter" : {
"gte" : "9223372036854775808",
"lte" : "18446744073709551615"
}
}
}
}
ソート値
特定のドキュメントに対して、unsigned_long
フィールドでソートを行うクエリの場合、Elasticsearchはこのドキュメントの値が長整数の範囲内であればlong
タイプのソート値を返し、範囲を超える場合はBigInteger
タイプのソート値を返します。
RESTクライアントは、このフィールドタイプを正しくサポートするために、JSON内の大きな整数値を処理できる必要があります。
Python
resp = client.search(
index="my_index",
query={
"match_all": {}
},
sort={
"my_counter": "desc"
},
)
print(resp)
Ruby
response = client.search(
index: 'my_index',
body: {
query: {
match_all: {}
},
sort: {
my_counter: 'desc'
}
}
)
puts response
Js
const response = await client.search({
index: "my_index",
query: {
match_all: {},
},
sort: {
my_counter: "desc",
},
});
console.log(response);
コンソール
GET /my_index/_search
{
"query": {
"match_all" : {}
},
"sort" : {"my_counter" : "desc"}
}
保存されたフィールド
## 集計
`````terms`````集計の場合、ソート値と同様に、`````Long`````または`````BigInteger`````の値が使用されます。他の集計の場合、値は`````double`````タイプに変換されます。
## スクリプト値
デフォルトでは、`````unsigned_long`````フィールドのスクリプト値はJavaの符号付き`````Long`````として返されます。これは、`````Long.MAX_VALUE`````を超える値が負の値として表示されることを意味します。これらの値を正しく扱うには、`````Long.compareUnsigned(long, long)`````、`````Long.divideUnsigned(long, long)`````、`````Long.remainderUnsigned(long, long)`````を使用できます。
たとえば、以下のスクリプトはカウンターの値を10で割った値を返します。
#### Python
``````python
resp = client.search(
index="my_index",
query={
"match_all": {}
},
script_fields={
"count10": {
"script": {
"source": "Long.divideUnsigned(doc['my_counter'].value, 10)"
}
}
},
)
print(resp)
`
Ruby
response = client.search(
index: 'my_index',
body: {
query: {
match_all: {}
},
script_fields: {
"count10": {
script: {
source: "Long.divideUnsigned(doc['my_counter'].value, 10)"
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_index",
query: {
match_all: {},
},
script_fields: {
count10: {
script: {
source: "Long.divideUnsigned(doc['my_counter'].value, 10)",
},
},
},
});
console.log(response);
コンソール
GET /my_index/_search
{
"query": {
"match_all" : {}
},
"script_fields": {
"count10" : {
"script": {
"source": "Long.divideUnsigned(doc['my_counter'].value, 10)"
}
}
}
}
代わりに、フィールドAPIを使用してスクリプト内で符号なしの長整数タイプをBigInteger
として扱うことができます。たとえば、このスクリプトはmy_counter
をBigInteger
として、デフォルト値BigInteger.ZERO
を持つように扱います:
Js
"script": {
"source": "field('my_counter').asBigInteger(BigInteger.ZERO)"
}
浮動小数点または倍精度の値を返す必要があるスクリプトの場合、BigInteger
の値を倍精度または浮動小数点にさらに変換できます:
Python
resp = client.search(
index="my_index",
query={
"script_score": {
"query": {
"match_all": {}
},
"script": {
"source": "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
}
}
},
)
print(resp)
Ruby
response = client.search(
index: 'my_index',
body: {
query: {
script_score: {
query: {
match_all: {}
},
script: {
source: "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
}
}
}
}
)
puts response
Js
const response = await client.search({
index: "my_index",
query: {
script_score: {
query: {
match_all: {},
},
script: {
source:
"field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()",
},
},
},
});
console.log(response);
コンソール
GET /my_index/_search
{
"query": {
"script_score": {
"query": {"match_all": {}},
"script": {
"source": "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
}
}
}
}
混合数値タイプのクエリ
一方がunsigned_long
である混合数値タイプの検索がサポートされていますが、ソートを伴うクエリは除きます。したがって、同じフィールド名が一方のインデックスでunsigned_long
タイプを持ち、もう一方のインデックスでlong
タイプを持つ2つのインデックス間のソートクエリは、正しい結果を生成せず、避けるべきです。このようなソートが必要な場合は、スクリプトベースのソートを代わりに使用できます。
一方がunsigned_long
である複数の数値タイプ間の集計がサポートされています。この場合、値はdouble
タイプに変換されます。