版本字段类型

编辑

version 字段类型是 keyword 字段的特化,用于处理软件版本值并支持其特定的优先级规则。优先级遵循 语义化版本 所述的规则定义,例如,主版本号、次版本号和修订号部分按数字排序(即 "2.1.0" < "2.4.1" < "2.11.2"),预发布版本排在发行版本之前(即 "1.0.0-alpha" < "1.0.0")。

您可以通过如下方式索引 version 字段

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "my_version": {
                "type": "version"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        my_version: {
          type: 'version'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      my_version: {
        type: "version",
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_version": {
        "type": "version"
      }
    }
  }
}

该字段提供与常规 keyword 字段相同的搜索功能。例如,可以使用 matchterm 查询搜索完全匹配,并支持前缀和通配符搜索。主要好处是 range 查询将遵循语义化版本排序,因此 "1.0.0" 和 "1.5.0" 之间的 range 查询将包含 "1.2.3" 版本,但不包含 "1.11.2" 版本。请注意,如果使用常规 keyword 字段进行索引,则排序方式将是字母顺序,这将有所不同。

软件版本应遵循 语义化版本规则 模式和优先级规则,但值得注意的是,允许使用多于或少于三个主要版本标识符(即 "1.2" 或 "1.2.3.4" 有效,而按照严格的语义化版本规则,它们将无效)。不符合语义化版本定义的版本字符串(例如 "1.2.alpha.4")仍然可以被索引并作为完全匹配项检索,但它们都将出现在任何有效的版本之后,按照常规的字母顺序排序。空字符串 "" 被认为无效,排序在所有有效版本之后,但在其他无效版本之前。

版本字段的参数

编辑

version 字段接受以下参数

meta

关于该字段的元数据。

限制

编辑

此字段类型未针对大量的通配符、正则表达式或模糊搜索进行优化。虽然这些类型的查询可以在此字段中使用,但如果您强烈依赖这些类型的查询,则应考虑使用常规的 keyword 字段。

合成 _source

编辑

合成 _source 仅对 TSDB 索引(将 index.mode 设置为 time_series 的索引)正式可用。对于其他索引,合成 _source 处于技术预览阶段。技术预览中的功能可能会在未来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 的约束。

version 字段在其默认配置中支持 合成 _source

合成源可能会对 version 字段值进行排序并删除重复项。例如

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "properties": {
            "versions": {
                "type": "version"
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "versions": [
            "8.0.0-beta1",
            "8.5.0",
            "0.90.12",
            "2.6.1",
            "1.3.4",
            "1.3.4"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      versions: {
        type: "version",
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    versions: ["8.0.0-beta1", "8.5.0", "0.90.12", "2.6.1", "1.3.4", "1.3.4"],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "versions": { "type": "version" }
    }
  }
}
PUT idx/_doc/1
{
  "versions": ["8.0.0-beta1", "8.5.0", "0.90.12", "2.6.1", "1.3.4", "1.3.4"]
}

将会变成

{
  "versions": ["0.90.12", "1.3.4", "2.6.1", "8.0.0-beta1", "8.5.0"]
}