ElasticSearch:比较点缀的版本字符串

Eld*_*dad 5 elasticsearch elasticsearch-plugin

我正在寻找一种方法来将点缀版本另存为弹性形式的字符串(例如“ 1.2.23”),然后在此字段上使用范围查询。例如

{
 "query": {
   "range": {
    "version": {"gte": "1.2.3", "lt": "1.3"}
   }
  }
}
Run Code Online (Sandbox Code Playgroud)

我只有3个组件(主要,次要,构建)。我需要能够确定

  • 1.20.3> 1.2.3
  • 1.02.4> 1.2.3
  • 1.3> 1.2.3

我考虑了以下方法:

  1. 用零填充(例如“ 1.2.3”->“ 000001.000002.000003”)。假设我知道每个组件的最大长度
  2. 分为3个不同的整数字段(即“主要”,“次要”,“内部”)。为此编写查询似乎很痛苦,但是我很乐意为此寻求建议。
  3. 也许某种自定义分析器?我看到了这一点:用于自然排序的Elasticsearch分析插件可能是一个不错的开始。

还有其他想法或建议吗?

Val*_*Val 4

如果您在索引代码中有一定的自由度来将这些语义版本转换为其他内容,我建议将每个版本转换为唯一的整数,然后很容易将这些数字与单个range查询进行比较。

算法很简单:

  1. 您将版本拆分为点:1.2.34=> 1, 2,34
  2. 将主要版本乘以 1000000:1=>1000000
  3. 将次要版本乘以 1000:2=>2000
  4. 将所有三个数字相加:1000000 + 2000 + 34=>1002034
  5. 您将结果数字存储到 ES 文档中,并使用它来比较range查询中的版本