无符号长整型字段类型
编辑无符号长整型字段类型编辑
无符号长整型是一种数值字段类型,表示一个无符号 64 位整数,最小值为 0,最大值为 264-1
(从 0 到 18446744073709551615 包含)。
response = client.indices.create( index: 'my_index', body: { mappings: { properties: { my_counter: { type: 'unsigned_long' } } } } ) puts response
PUT my_index { "mappings": { "properties": { "my_counter": { "type": "unsigned_long" } } } }
无符号长整型可以以数值或字符串形式索引,表示范围 [0, 18446744073709551615] 内的整数值。它们不能有小数部分。
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
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}
术语查询接受以数值或字符串形式表示的任何数字。
response = client.search( index: 'my_index', body: { query: { term: { my_counter: 18_446_744_073_709_552_000 } } } ) puts response
GET /my_index/_search { "query": { "term" : { "my_counter" : 18446744073709551615 } } }
范围查询项可以包含带有小数部分的值。在这种情况下,Elasticsearch 会将它们转换为整数值:gte
和 gt
项将转换为最接近的向上包含的整数,而 lt
和 lte
范围将转换为最接近的向下包含的整数。
建议将范围作为字符串传递,以确保它们在没有精度损失的情况下被解析。
response = client.search( index: 'my_index', body: { query: { range: { my_counter: { gte: '9223372036854775808', lte: '18446744073709551615' } } } } ) puts response
GET /my_index/_search { "query": { "range" : { "my_counter" : { "gte" : "9223372036854775808", "lte" : "18446744073709551615" } } } }
排序值编辑
对于在 unsigned_long
字段上进行排序的查询,对于特定文档,Elasticsearch 返回类型为 long
的排序值(如果该文档的值在长整型值的范围内),或者类型为 BigInteger
的排序值(如果该值超过此范围)。
REST 客户端需要能够处理 JSON 中的大整数,才能正确支持此字段类型。
response = client.search( index: 'my_index', body: { query: { match_all: {} }, sort: { my_counter: 'desc' } } ) puts response
GET /my_index/_search { "query": { "match_all" : {} }, "sort" : {"my_counter" : "desc"} }
存储字段编辑
存储的 unsigned_long
字段将存储并作为 String
返回。
聚合编辑
对于 terms
聚合,与排序值类似,使用 Long
或 BigInteger
值。对于其他聚合,值将转换为 double
类型。
脚本值编辑
默认情况下,unsigned_long
字段的脚本值将作为 Java 有符号 Long
返回,这意味着大于 Long.MAX_VALUE
的值将显示为负值。您可以使用 Long.compareUnsigned(long, long)
、Long.divideUnsigned(long, long)
和 Long.remainderUnsigned(long, long)
来正确处理这些值。
例如,下面的脚本返回计数器除以 10 的值。
response = client.search( index: 'my_index', body: { query: { match_all: {} }, script_fields: { "count10": { script: { source: "Long.divideUnsigned(doc['my_counter'].value, 10)" } } } } ) puts 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
"script": { "source": "field('my_counter').asBigInteger(BigInteger.ZERO)" }
对于需要返回浮点数或双精度数的脚本,您可以进一步将 BigInteger
值转换为双精度数或浮点数
response = client.search( index: 'my_index', body: { query: { script_score: { query: { match_all: {} }, script: { source: "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()" } } } } ) puts 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
类型)不会产生正确的结果,必须避免。如果需要这种排序,可以使用基于脚本的排序。
支持跨多个数值类型(其中一个为 unsigned_long
)的聚合。在这种情况下,值将转换为 double
类型。