以下是我的数据示例:
{
"MOD_DATE_START": "2010-04-20T15:05:49Z",
"MOD_DATE_END": null,
"MOD_ID": "123456789",
}
我的Elasticsearch查询存在一些问题。我有几个日期字段,我正在进行基于范围的过滤,以确保我的日期在开始日期和结束日期之间。
我的第一个查询(效果很好)是对:
进行过滤curl -s -XPOST http://server:9200/myindex/mytype/_search?pretty=true -d '
{
"fields": ["MOD_ID", "MOD_DATE_START", "MOD_DATE_END"],
"query": {
"bool": {
"must": [
{"term": {"MOD_ID": "123456789"}},
{"range": {"MOD_DATE_START": {"lte": "2012-04-20T15:05:49Z"}}}
]
}
}
}
'
MOD_DATE_START字段始终包含信息,因此第一个查询效果很好。
由于第二个日期字段MOD_DATE_END在大多数情况下为空,我想修改我的查询,添加以下测试:
IF "MOD_DATE_END" NOT NULL then
{"range": {"MOD_DATE_END": {"gte": "2012-04-20T15:05:49Z"}}}
ELSE skip "MOD_DATE_END"
但是,我无法弄清楚如何修改我的查询以添加第三个条件以便能够成功执行gte测试。
提前感谢您的帮助。
答案 0 :(得分:2)
实现此目标的一种方法是在missing filter中使用filtered query。 示例如下:
curl -s -XPOST http://server:9200/myindex/mytype/_search?pretty=true -d '
{
"fields": ["MOD_ID", "MOD_DATE_START", "MOD_DATE_END"],
"query": {
"filtered": {
"filter": {
"bool": {
"must": {
"range": {
"MOD_DATE_START": {
"lte": "2012-04-20T15:05:49Z"
}
}
},
"should": [
{
"missing": {
"field": "MOD_DATE_END",
"null_value": true,
"existence": true
}
},
{
"range": {
"MOD_DATE_START": {
"gte": "2012-04-20T15:05:49Z"
}
}
}
]
}
},
"query": {
"term": {
"MOD_ID": "123456789"
}
}
}
}
}
'