符号なしの長整数フィールドタイプ

符号なしの長整数は、最小値が0で最大値が264-1(0から18446744073709551615まで含む)の符号なし64ビット整数を表す数値フィールドタイプです。

Python

  1. resp = client.indices.create(
  2. index="my_index",
  3. mappings={
  4. "properties": {
  5. "my_counter": {
  6. "type": "unsigned_long"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my_index',
  3. body: {
  4. mappings: {
  5. properties: {
  6. my_counter: {
  7. type: 'unsigned_long'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my_index",
  3. mappings: {
  4. properties: {
  5. my_counter: {
  6. type: "unsigned_long",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT my_index
  2. {
  3. "mappings": {
  4. "properties": {
  5. "my_counter": {
  6. "type": "unsigned_long"
  7. }
  8. }
  9. }
  10. }

符号なしの長整数は、数値または文字列形式でインデックス化でき、範囲[0, 18446744073709551615]の整数値を表します。小数部分を持つことはできません。

Python

  1. resp = client.bulk(
  2. index="my_index",
  3. refresh=True,
  4. operations=[
  5. {
  6. "index": {
  7. "_id": 1
  8. }
  9. },
  10. {
  11. "my_counter": 0
  12. },
  13. {
  14. "index": {
  15. "_id": 2
  16. }
  17. },
  18. {
  19. "my_counter": 9223372036854776000
  20. },
  21. {
  22. "index": {
  23. "_id": 3
  24. }
  25. },
  26. {
  27. "my_counter": 18446744073709552000
  28. },
  29. {
  30. "index": {
  31. "_id": 4
  32. }
  33. },
  34. {
  35. "my_counter": 18446744073709552000
  36. }
  37. ],
  38. )
  39. print(resp)

Ruby

  1. response = client.bulk(
  2. index: 'my_index',
  3. refresh: true,
  4. body: [
  5. {
  6. index: {
  7. _id: 1
  8. }
  9. },
  10. {
  11. my_counter: 0
  12. },
  13. {
  14. index: {
  15. _id: 2
  16. }
  17. },
  18. {
  19. my_counter: 9_223_372_036_854_776_000
  20. },
  21. {
  22. index: {
  23. _id: 3
  24. }
  25. },
  26. {
  27. my_counter: 18_446_744_073_709_552_000
  28. },
  29. {
  30. index: {
  31. _id: 4
  32. }
  33. },
  34. {
  35. my_counter: 18_446_744_073_709_552_000
  36. }
  37. ]
  38. )
  39. puts response

Js

  1. const response = await client.bulk({
  2. index: "my_index",
  3. refresh: "true",
  4. operations: [
  5. {
  6. index: {
  7. _id: 1,
  8. },
  9. },
  10. {
  11. my_counter: 0,
  12. },
  13. {
  14. index: {
  15. _id: 2,
  16. },
  17. },
  18. {
  19. my_counter: 9223372036854776000,
  20. },
  21. {
  22. index: {
  23. _id: 3,
  24. },
  25. },
  26. {
  27. my_counter: 18446744073709552000,
  28. },
  29. {
  30. index: {
  31. _id: 4,
  32. },
  33. },
  34. {
  35. my_counter: 18446744073709552000,
  36. },
  37. ],
  38. });
  39. console.log(response);

コンソール

  1. POST /my_index/_bulk?refresh
  2. {"index":{"_id":1}}
  3. {"my_counter": 0}
  4. {"index":{"_id":2}}
  5. {"my_counter": 9223372036854775808}
  6. {"index":{"_id":3}}
  7. {"my_counter": 18446744073709551614}
  8. {"index":{"_id":4}}
  9. {"my_counter": 18446744073709551615}

タームクエリは、数値または文字列形式の任意の数値を受け入れます。

Python

  1. resp = client.search(
  2. index="my_index",
  3. query={
  4. "term": {
  5. "my_counter": 18446744073709552000
  6. }
  7. },
  8. )
  9. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_index',
  3. body: {
  4. query: {
  5. term: {
  6. my_counter: 18_446_744_073_709_552_000
  7. }
  8. }
  9. }
  10. )
  11. puts response

Js

  1. const response = await client.search({
  2. index: "my_index",
  3. query: {
  4. term: {
  5. my_counter: 18446744073709552000,
  6. },
  7. },
  8. });
  9. console.log(response);

コンソール

  1. GET /my_index/_search
  2. {
  3. "query": {
  4. "term" : {
  5. "my_counter" : 18446744073709551615
  6. }
  7. }
  8. }

範囲クエリのタームは小数部分を含む値を持つことができます。この場合、Elasticsearchはそれらを整数値に変換します:gteおよびgtのタームは、上限を含む最も近い整数に変換され、ltおよびlteの範囲は、下限を含む最も近い整数に変換されます。

精度の損失なく解析されることを保証するために、範囲を文字列として渡すことをお勧めします。

Python

  1. resp = client.search(
  2. index="my_index",
  3. query={
  4. "range": {
  5. "my_counter": {
  6. "gte": "9223372036854775808",
  7. "lte": "18446744073709551615"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_index',
  3. body: {
  4. query: {
  5. range: {
  6. my_counter: {
  7. gte: '9223372036854775808',
  8. lte: '18446744073709551615'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. index: "my_index",
  3. query: {
  4. range: {
  5. my_counter: {
  6. gte: "9223372036854775808",
  7. lte: "18446744073709551615",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. GET /my_index/_search
  2. {
  3. "query": {
  4. "range" : {
  5. "my_counter" : {
  6. "gte" : "9223372036854775808",
  7. "lte" : "18446744073709551615"
  8. }
  9. }
  10. }
  11. }

ソート値

特定のドキュメントに対して、unsigned_longフィールドでソートを行うクエリの場合、Elasticsearchはこのドキュメントの値が長整数の範囲内であればlongタイプのソート値を返し、範囲を超える場合はBigIntegerタイプのソート値を返します。

RESTクライアントは、このフィールドタイプを正しくサポートするために、JSON内の大きな整数値を処理できる必要があります。

Python

  1. resp = client.search(
  2. index="my_index",
  3. query={
  4. "match_all": {}
  5. },
  6. sort={
  7. "my_counter": "desc"
  8. },
  9. )
  10. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_index',
  3. body: {
  4. query: {
  5. match_all: {}
  6. },
  7. sort: {
  8. my_counter: 'desc'
  9. }
  10. }
  11. )
  12. puts response

Js

  1. const response = await client.search({
  2. index: "my_index",
  3. query: {
  4. match_all: {},
  5. },
  6. sort: {
  7. my_counter: "desc",
  8. },
  9. });
  10. console.log(response);

コンソール

  1. GET /my_index/_search
  2. {
  3. "query": {
  4. "match_all" : {}
  5. },
  6. "sort" : {"my_counter" : "desc"}
  7. }

保存されたフィールド

  1. ## 集計
  2. `````terms`````集計の場合、ソート値と同様に、`````Long`````または`````BigInteger`````の値が使用されます。他の集計の場合、値は`````double`````タイプに変換されます。
  3. ## スクリプト値
  4. デフォルトでは、`````unsigned_long`````フィールドのスクリプト値はJavaの符号付き`````Long`````として返されます。これは、`````Long.MAX_VALUE`````を超える値が負の値として表示されることを意味します。これらの値を正しく扱うには、`````Long.compareUnsigned(long, long)``````````Long.divideUnsigned(long, long)``````````Long.remainderUnsigned(long, long)`````を使用できます。
  5. たとえば、以下のスクリプトはカウンターの値を10で割った値を返します。
  6. #### Python
  7. ``````python
  8. resp = client.search(
  9. index="my_index",
  10. query={
  11. "match_all": {}
  12. },
  13. script_fields={
  14. "count10": {
  15. "script": {
  16. "source": "Long.divideUnsigned(doc['my_counter'].value, 10)"
  17. }
  18. }
  19. },
  20. )
  21. print(resp)
  22. `

Ruby

  1. response = client.search(
  2. index: 'my_index',
  3. body: {
  4. query: {
  5. match_all: {}
  6. },
  7. script_fields: {
  8. "count10": {
  9. script: {
  10. source: "Long.divideUnsigned(doc['my_counter'].value, 10)"
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "my_index",
  3. query: {
  4. match_all: {},
  5. },
  6. script_fields: {
  7. count10: {
  8. script: {
  9. source: "Long.divideUnsigned(doc['my_counter'].value, 10)",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);

コンソール

  1. GET /my_index/_search
  2. {
  3. "query": {
  4. "match_all" : {}
  5. },
  6. "script_fields": {
  7. "count10" : {
  8. "script": {
  9. "source": "Long.divideUnsigned(doc['my_counter'].value, 10)"
  10. }
  11. }
  12. }
  13. }

代わりに、フィールドAPIを使用してスクリプト内で符号なしの長整数タイプをBigIntegerとして扱うことができます。たとえば、このスクリプトはmy_counterBigIntegerとして、デフォルト値BigInteger.ZEROを持つように扱います:

Js

  1. "script": {
  2. "source": "field('my_counter').asBigInteger(BigInteger.ZERO)"
  3. }

浮動小数点または倍精度の値を返す必要があるスクリプトの場合、BigIntegerの値を倍精度または浮動小数点にさらに変換できます:

Python

  1. resp = client.search(
  2. index="my_index",
  3. query={
  4. "script_score": {
  5. "query": {
  6. "match_all": {}
  7. },
  8. "script": {
  9. "source": "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.search(
  2. index: 'my_index',
  3. body: {
  4. query: {
  5. script_score: {
  6. query: {
  7. match_all: {}
  8. },
  9. script: {
  10. source: "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. index: "my_index",
  3. query: {
  4. script_score: {
  5. query: {
  6. match_all: {},
  7. },
  8. script: {
  9. source:
  10. "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()",
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);

コンソール

  1. GET /my_index/_search
  2. {
  3. "query": {
  4. "script_score": {
  5. "query": {"match_all": {}},
  6. "script": {
  7. "source": "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
  8. }
  9. }
  10. }
  11. }

混合数値タイプのクエリ

一方がunsigned_longである混合数値タイプの検索がサポートされていますが、ソートを伴うクエリは除きます。したがって、同じフィールド名が一方のインデックスでunsigned_longタイプを持ち、もう一方のインデックスでlongタイプを持つ2つのインデックス間のソートクエリは、正しい結果を生成せず、避けるべきです。このようなソートが必要な場合は、スクリプトベースのソートを代わりに使用できます。

一方がunsigned_longである複数の数値タイプ間の集計がサポートされています。この場合、値はdoubleタイプに変換されます。