我有我想用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。
提前致谢。
答案 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"}
}
}
}
}