ElasticSearch:比较虚线版本字符串

时间:2016-06-11 12:43:06

标签: elasticsearch elasticsearch-plugin

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

{
 "query": {
   "range": {
    "version": {"gte": "1.2.3", "lt": "1.3"}
   }
  }
}

我只有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个不同的整数字段(即“major”,“minor”,“build”)。为此撰写查询似乎很痛苦,但我很乐意为此提出建议。
  3. 也许是某种自定义分析仪?我看到了这个:Elasticsearch analysis plugin for natural sort这可能是一个好的开始。
  4. 还有其他想法或建议吗?

1 个答案:

答案 0 :(得分:1)

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

算法很简单:

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