【问题标题】:String range query in ElasticsearchElasticsearch 中的字符串范围查询
【发布时间】:2016-06-06 16:27:24
【问题描述】:

我正在尝试使用以下范围查询来查询 Elasticsearch 集群 (2.3) 中的数据。为了澄清,我正在搜索一个包含一组值的字段,这些值是通过将两个 id 与计数连接在一起而得出的。例如:

架构:

{
  id1: 111,
  id2: 222,
  count: 5
}

我使用的查询如下所示:

查询:

{
  "query": {
  "bool": {
    "must": {
      "range": {
        "myfield": {
          "from": "111_222_1",
          "to": "111_222_2147483647",
          "include_lower": true,
          "include_upper": true
          }
        }
      }
    }
  }
}

to 字段使用Integer.MAX_VALUE

这可以正常工作,但与基础数据不完全匹配。通过其他方式查询比这种方式产生的结果更多。

更奇怪的是,在 from 字段中尝试 111_222_5 会产生 0 个结果,而尝试 111_222_10 确实会产生结果。

ES(和/或 Lucene)如何解释这个范围查询,为什么会产生如此奇怪的结果?我最初的猜测是它没有查看字符串最后一部分的完整值,可能只查看第一个数字。

有没有办法为 TermRange 指定格式?我了解日期范围允许格式化。

【问题讨论】:

  • 对to 值使用111_222_null 开始越来越接近准确的结果,但是在增加from 时仍然会给出奇怪的结果。从理论上讲,结果应该越来越少,但是当达到 10 时会有一个尖峰。这进一步让我认为它只使用了第一个数字。看起来当我使用 10 时,它开始寻找计数 10 的文档。

标签: elasticsearch lucene range


【解决方案1】:

A look here provides the answer.

范围的方式是字典顺序,5在50之前在6之前,等等。

为了解决这个问题,我使用一个固定长度的字符串来重新索引计数。

0000000001
0000000100
0001000101
...

【讨论】:

  • 这回答了为什么,但如何解决这个问题仍然存在。我是否必须重新索引才能使用前置 0 来执行位置值? 111_222_00001
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多