我试图在ElasticSearch中创建 bool过滤器,检查start_date
和end_date
与今天相比。如果start_date
或end_date
为空,则仍应返回结果。
例如,今天是2016-08-09。
似乎无法使用我当前的代码:
POST _search
{
"query":{
"filtered": {
"query": {
"match_all": {}
},
"filter" : {
"bool": {
"must": [{
"range": {
"start_date": {"lte": "2016-08-09"}
}
},
{
"range": {
"end_date": {"gte": "2016-08-09"}
}
}],
"should": [{
"missing": {
"field": "start_date"
}
},
{
"missing": {
"field": "end_date"
}
}]
}
}
}
}
}
答案 0 :(得分:2)
你可能需要这样的东西,即:
start_date
必须为null或今天之前end_date
必须为null或今天之后修订查询:
POST _search
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"range": {
"start_date": {
"lte": "now"
}
}
},
{
"missing": {
"field": "start_date"
}
}
]
}
},
{
"bool": {
"should": [
{
"range": {
"end_date": {
"gte": "now"
}
}
},
{
"missing": {
"field": "end_date"
}
}
]
}
}
]
}
}
}
}
}
答案 1 :(得分:0)
看起来您需要以下查询:
(start_date <= date AND date <= end_date) OR (start_date == null) OR (end_date == null)
按照elasticsearch documentation的示例,我将编写以下条款:
"bool": {
"should": [
{"bool":
"must": [{
"range": {
"start_date": {
"lte": "2016-08-09"
}
}
},
{
"range": {
"end_date": {
"gte": "2016-08-09"
}
}
}]
},
"missing": {
"field": "start_date"
},
"missing": {
"field": "end_date"
}
]
}
如果它不能完全按照书面形式工作,我会尝试通过执行查询来查看should
子句的每个部分是否有效(即日期在一个范围内,start_date不存在,end_date不存在)用这些单件。如果所有这些都有效,那么在should
子句中组合它们也应该有用。