【问题标题】:Elasticsearch. Range query for strings with dashes弹性搜索。带有破折号的字符串的范围查询
【发布时间】:2016-05-04 06:36:05
【问题描述】:

我正在对具有日期值的字符串字段的数据使用弹性搜索,如下所示:

"2016-01-25 18:40:18.933"

我正在尝试使用范围过滤器来获取从日期到日期的值。例如:

 "查询" : {
        “过滤”:{
            “询问” : {
                “范围” : {
                    “创建日期” : {
                        “gte”:“2015-11-01”,
                        “lte”:“2016-01-25”
                    }
                }
            }
        }
      }
    }

但结果不包含带有"createdDate": "2015-12-14 20:28:23.557"的值

如果我使用"gte": "2015""gte": "2014-12-31",那么带有"createdDate": "2015-12-14" 的值将包含在结果中。

我的查询有什么问题?

【问题讨论】:

  • 你能分享你的createdDate字段的映射吗? curl -XGET localhost:9200/index/_mapping
  • { "documents": { "mappings": { "order": { "properties": { ... "createdDate": { "type": "string" }

标签: search elasticsearch range


【解决方案1】:

如果您希望能够在日期上运行range 查询,则需要将您的字段映射为date field,否则它将无法按预期工作。在您共享的映射中,createdDatestring。您需要擦除您的索引并使用正确的 createdDate 字段映射创建一个新索引,如下所示:

curl -XPOST localhost:9200/documents -d '{
   "mappings": {
      "order": {
         "properties": {
             "createdDate": {
                "type": "date"
             }
         }
      }
   }
}' 

然后您可以重新索引您的数据,您的 range 查询将按预期工作。

【讨论】:

  • 感谢您的回复!我在将字段转换为日期时遇到问题,因为外部团队支持的弹性服务不仅我使用它。所以,可能并不简单。我以为elastic可以范围字符串字段(elastic.co/guide/en/elasticsearch/guide/current/…)而且它在其他领域也有效,那为什么在这个领域有问题呢?
  • range 查询适用于字符串字段,但它要做的只是执行“字典”范围(即字母顺序),即它不会解释日期。如果您希望能够使用此字段过滤日期范围,则它必须是 date 字段。
  • 从字典范围来看,字符串“2015-12-14”不大于字符串“2015-11-01”?我认为它按字符比较字符串,“2015-1”等于,但“2”大于“1”
  • 这里的问题是你的字符串也被分析了,所以字符串2015-12-14 20:28:23.557会被分词为以下六个token,即20151214202823.557。因此,range 不会在完整的字符串值上运行,而是在那些标记上运行。
  • 好的,再次感谢您!我会尝试将字段转换为日期类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多