Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Картирование ›Типы данных полей

Тип поля unsigned long

Тип поля unsigned long представляет собой числовой тип данных, который представляет собой целое беззнаковое 64-битное число с минимальным значением 0 и максимальным значением 264-1 (от 0 до 18446744073709551615 включительно).

resp = client.indices.create(
    index="my_index",
    mappings={
        "properties": {
            "my_counter": {
                "type": "unsigned_long"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my_index',
  body: {
    mappings: {
      properties: {
        my_counter: {
          type: 'unsigned_long'
        }
      }
    }
  }
)
puts response
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"
      }
    }
  }
}

Тип unsigned long может быть индексирован в числовом или строковом формате, представляя целые значения в диапазоне [0, 18446744073709551615]. Они не могут иметь дробную часть.

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)
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
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}

Термовые запросы принимают любые числа в числовом или строковом формате.

resp = client.search(
    index="my_index",
    query={
        "term": {
            "my_counter": 18446744073709552000
        }
    },
)
print(resp)
response = client.search(
  index: 'my_index',
  body: {
    query: {
      term: {
        my_counter: 18_446_744_073_709_552_000
      }
    }
  }
)
puts response
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 диапазоны преобразуются в ближайшее целое значение вниз включительно.

Рекомендуется передавать диапазоны в виде строк, чтобы обеспечить их парсинг без потери точности.

resp = client.search(
    index="my_index",
    query={
        "range": {
            "my_counter": {
                "gte": "9223372036854775808",
                "lte": "18446744073709551615"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my_index',
  body: {
    query: {
      range: {
        my_counter: {
          gte: '9223372036854775808',
          lte: '18446744073709551615'
        }
      }
    }
  }
)
puts response
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, чтобы правильно поддерживать этот тип поля.

resp = client.search(
    index="my_index",
    query={
        "match_all": {}
    },
    sort={
        "my_counter": "desc"
    },
)
print(resp)
response = client.search(
  index: 'my_index',
  body: {
    query: {
      match_all: {}
    },
    sort: {
      my_counter: 'desc'
    }
  }
)
puts response
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"}
}

Сохраненные поля

Сохраненное поле 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.

resp = client.search(
    index="my_index",
    query={
        "match_all": {}
    },
    script_fields={
        "count10": {
            "script": {
                "source": "Long.divideUnsigned(doc['my_counter'].value, 10)"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my_index',
  body: {
    query: {
      match_all: {}
    },
    script_fields: {
      "count10": {
        script: {
          source: "Long.divideUnsigned(doc['my_counter'].value, 10)"
        }
      }
    }
  }
)
puts response
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)"
          }
        }
    }
}

В качестве альтернативы, вы можете рассматривать тип unsigned long как BigInteger в своих скриптах, используя API поля. Например, этот скрипт рассматривает my_counter как BigInteger с по умолчанию значением BigInteger.ZERO:

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

Для скриптов, которым необходимо вернуть значения типа float или double, вы можете дополнительно преобразовать значения BigInteger в double или float:

resp = client.search(
    index="my_index",
    query={
        "script_score": {
            "query": {
                "match_all": {}
            },
            "script": {
                "source": "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'my_index',
  body: {
    query: {
      script_score: {
        query: {
          match_all: {}
        },
        script: {
          source: "field('my_counter').asBigInteger(BigInteger.ZERO).floatValue()"
        }
      }
    }
  }
)
puts response
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 в другом, не даёт правильных результатов и должен быть избегнут. Если требуется такая сортировка, можно использовать скриптовую сортировку.

Поддерживаются агрегации по нескольким числовым типам, одним из которых является unsigned_long. В этом случае значения преобразуются в тип double.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/unsigned-long.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API