如何使用ElasticSearch 5.1索引日期范围

时间:2017-05-02 19:58:50

标签: elasticsearch

我有我想用ElasticSearch索引/搜索的文档。这些文档可能包含多个日期,在某些情况下,日期实际上是日期范围。我想知道是否有人可以帮我弄清楚如何编写一个做正确事情的查询(或者如何正确索引我的文档以便我可以查询它)。

一个例子胜过千言万语。假设该文件包含两个结婚日期范围:2005-05-05至2007-07-07和2012-12-012至2014-03-03。

如果我在开始日期和结束日期字段中索引每个日期范围,并编写典型范围查询,那么搜索2008-01-01将返回此记录,因为一个婚姻将满足其中一个不等式,另一个将满足另一个。我不知道如何让ES保持两个日期范围分开。显然,拥有marriage1和marriage2字段可以解决这个特殊问题,但在我的实际数据集中,我有一个无限数量的日期。

我知道ES 5.2支持date_range数据类型,我相信这会解决这个问题,但我仍然坚持使用5.1,因为我使用的是AWS的托管ES。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以将nested objects用于此目的。

PUT /records
{
  "mappings": {
    "record": {
      "properties": {
        "marriage": {
          "type": "nested", 
          "properties": {
            "start":    { "type": "date"  },  
            "end": { "type": "date"  },  
            "person1":     { "type": "string"   },  
            "person2":   { "type": "string"   }   
          }   
        }   
      }   
    }   
  }
}

PUT /records/record/1

{
  "marriage": [ { "start" : "2005-05-05","end" :"2007-07-07" , "person1" : "","person2" :"" },{"start": "2012-12-12","end": "2014-03-03","person1" : "","person2" :"" }]
}

POST /records/record/_search
{
  "query": {

          "nested": {
            "path": "marriage", 
            "query": {

                    "range": {
                      "marriage.start":  { "gte": "2008-01-01", "lte": "2015-02-03"}
                    }   

            }   
          }   

 }