Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions _mappings/supported-field-types/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ You can specify data types for your fields when creating a mapping. The followin
| [`wildcard`]({{site.url}}{{site.baseurl}}/mappings/supported-field-types/wildcard/) | Enables efficient substring and regex matching. |
| [`token_count`]({{site.url}}{{site.baseurl}}/mappings/supported-field-types/token-count/) | Stores the number of tokens after analysis. |
| [`constant_keyword`]({{site.url}}{{site.baseurl}}/mappings/supported-field-types/constant-keyword/) | Uses the same value for all documents in the index. |
| [`version`]({{site.url}}{{site.baseurl}}/mappings/supported-field-types/version/) | A semantic version string that follows semantic versioning specification. |

## Numeric field types

Expand Down
307 changes: 307 additions & 0 deletions _mappings/supported-field-types/version.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,307 @@
---
layout: default
title: Version
parent: Supported field types
nav_order: 75
redirect_from:
- /opensearch/supported-field-types/version/
- /field-types/supported-field-types/version/
---

# Version field type
**Introduced 3.2**
{: .label .label-purple }

The `version` field type is designed for indexing and querying version strings that follow [Semantic Versioning (SemVer)](https://semver.org/) specifications. This field type enables proper ordering and comparison of version strings such as `1.0.0`, `2.1.0-alpha`, `1.3.0+build.1`, and others.

The `version` field type provides the following functionality:

- Correctly parses semantic version strings with major, minor, and patch components
- Handles pre-release identifiers like `-alpha`, `-beta`, `-rc.1`
- Accepts build metadata like `+build.123` but ignores it for ordering (per SemVer specification)
- Versions are sorted according to semantic versioning rules (e.g., `1.0.0-alpha < 1.0.0-beta < 1.0.0`)
- Compatible with various query types including range, term, terms, wildcard, prefix, and more

## Version format

Version strings must follow the semantic versioning format:

```
<major>.<minor>.<patch>[-<pre-release>][+<build-metadata>]
```

The variables in the preceding format must be provided as follows.

| Component | Required/Optional | Description | Example |
|:----------|:------------------|:------------|:--------|
| `major`, `minor`, `patch` | Required | Non-negative integers representing the core version number | `1.2.3` |
| `pre-release` | Optional | Alphanumeric identifiers separated by dots, indicating a pre-release version | `-alpha`, `-beta.1`, `-rc.2` |
| `build-metadata` | Optional | Alphanumeric identifiers separated by dots, providing build information (ignored for ordering) | `+build.123`, `+20230815` |

## Example mapping

Create an index with a version field:

```json
PUT test_versions
{
"mappings": {
"properties": {
"app": {
"type": "keyword"
},
"version": {
"type": "version"
},
"release_date": {
"type": "date"
},
"description": {
"type": "text"
}
}
}
}
```
{% include copy-curl.html %}


## Indexing version data

Index documents with version fields:

```json
POST test_versions/_bulk
{ "index": {} }
{ "app": "AlphaApp", "version": "1.0.0", "release_date": "2023-01-01", "description": "Initial release" }
{ "index": {} }
{ "app": "AlphaApp", "version": "1.0.1", "release_date": "2023-02-15", "description": "Bug fix release" }
{ "index": {} }
{ "app": "AlphaApp", "version": "1.1.0", "release_date": "2023-05-10", "description": "Minor feature update" }
{ "index": {} }
{ "app": "AlphaApp", "version": "2.0.0", "release_date": "2024-01-01", "description": "Major release" }
{ "index": {} }
{ "app": "BetaApp", "version": "0.9.0", "release_date": "2022-12-01", "description": "Beta release" }
{ "index": {} }
{ "app": "BetaApp", "version": "1.0.0-alpha", "release_date": "2023-03-01", "description": "Alpha pre-release" }
{ "index": {} }
{ "app": "BetaApp", "version": "1.0.0-alpha.1", "release_date": "2023-03-10", "description": "Alpha patch" }
{ "index": {} }
{ "app": "BetaApp", "version": "1.0.0-beta", "release_date": "2023-04-01", "description": "Beta pre-release" }
{ "index": {} }
{ "app": "BetaApp", "version": "1.0.0-rc.1", "release_date": "2023-04-15", "description": "Release candidate" }
{ "index": {} }
{ "app": "BetaApp", "version": "1.0.0+20230815", "release_date": "2023-08-15", "description": "Build metadata release" }
```
{% include copy-curl.html %}

## Querying version fields

The version field type supports various query types.

### Term query

Find documents with a specific version:

```json
GET test_versions/_search
{
"query": {
"term": { "version": "1.0.1" }
}
}
```
{% include copy-curl.html %}

#### Response

```json
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0466295,
"hits": [
{
"_index": "test_versions",
"_id": "cSWNQpcBY7cEASBv3Vr1",
"_score": 1.0466295,
"_source": {
"app": "AlphaApp",
"version": "1.0.1",
"release_date": "2023-02-15",
"description": "Bug fix release"
}
}
]
}
}
```

### Range query

Find versions within a specific range:

```json
GET test_versions/_search
{
"query": {
"range": {
"version": { "gte": "2.0.0" }
}
}
}
```
{% include copy-curl.html %}

#### Response

```json
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_versions",
"_id": "cyWNQpcBY7cEASBv3Vr1",
"_score": 1,
"_source": {
"app": "AlphaApp",
"version": "2.0.0",
"release_date": "2024-01-01",
"description": "Major release"
}
}
]
}
}
```

### Terms query

Find documents matching multiple specific versions:

```json
GET test_versions/_search
{
"query": {
"terms": {
"version": ["1.0.0", "1.0.0-alpha"]
}
}
}
```
{% include copy-curl.html %}

### Wildcard query

Find versions matching a pattern:

```json
GET test_versions/_search
{
"query": {
"wildcard": {
"version": "1.2.0-*"
}
}
}
```
{% include copy-curl.html %}

### Prefix query

Find versions with a specific prefix:

```json
GET test_versions/_search
{
"query": {
"prefix": {
"version": {
"value": "1.0.0-"
}
}
}
}
```
{% include copy-curl.html %}

## Sorting by version

To sort by version, provide the `sort` parameter in the request. Versions are sorted according to semantic versioning rules:

```json
GET test_versions/_search
{
"query": { "match_all": {} },
"sort": [
{ "version": { "order": "asc" } }
]
}
```
{% include copy-curl.html %}

This request returns documents sorted in version order, with pre-release versions appearing before their corresponding stable versions: `0.9.0`, `1.0.0-alpha`, `1.0.0-alpha.1`, `1.0.0-beta`, `1.0.0-rc.1`, `1.0.0+20230815`, `1.0.1`, `1.1.0`, `2.0.0`.

## Version comparison rules

The version field follows semantic versioning comparison rules:

1. `major`, `minor`, `patch`: Compared numerically (`1.2.3` < `1.2.4` < `1.3.0` < `2.0.0`)
2. Pre-release precedence: Pre-release versions have lower precedence than normal versions (`1.0.0-alpha` < `1.0.0`)
3. Pre-release comparison: When both versions are pre-releases, they are compared lexically by each dot-separated identifier (`1.0.0-alpha` < `1.0.0-alpha.1` < `1.0.0-beta`)
4. Build metadata ignored: Build metadata does not affect version precedence (`1.0.0+build.1` equals `1.0.0+build.2` for sorting purposes)

## Parameters

The version field type accepts the following optional parameters.

Parameter | Description
:--- | :---
`null_value` | A value to be substituted for any explicit `null` values. Must be a valid version string. Defaults to `null`, which means `null` fields are treated as missing.

### Example with null_value

```json
PUT software_with_nulls
{
"mappings": {
"properties": {
"version": {
"type": "version",
"null_value": "0.0.0"
}
}
}
}
```
{% include copy-curl.html %}

## Limitations

- Version strings must follow the semantic versioning format. Invalid version strings will cause indexing to fail.
- Build metadata (part after `+`) is accepted but ignored during comparisons and sorting.
- The field does not support advanced version range specifications like `^1.2.3` or `~1.2.0`; use [`range` queries]({{site.url}}{{site.baseurl}}/query-dsl/term/range/) instead.