无符号长整型字段类型编辑

无符号长整型是一种数值字段类型,表示一个无符号 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 会将它们转换为整数值:gtegt 项将转换为最接近的向上包含的整数,而 ltlte 范围将转换为最接近的向下包含的整数。

建议将范围作为字符串传递,以确保它们在没有精度损失的情况下被解析。

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 聚合,与排序值类似,使用 LongBigInteger 值。对于其他聚合,值将转换为 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 类型。