我正在尝试使用包含范围的 OR 语句查询我的索引,为此我构建了以下查询(在文档的帮助下):
{
"query": {
"match_all": {}
},
"size": 50,
"filter": {
"or": [{
"term": {
"fromPlace": "liverpool"
},
"range" : {
"query" : {
"gte": "01/01/2012",
"lte": "2013",
"format": "dd/MM/yyyy||yyyy"
}
}
}]
}
}
但是,这给了我一个“查询格式错误,start_object 后没有字段”错误。完整的错误信息:
{
"error": {
"root_cause": [
{
"type": "query_parsing_exception",
"reason": "[_na] query malformed, no field after start_object",
"index": "quote-lanes2",
"line": 13,
"col": 15
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "quote-lanes2",
"node": "opqibf4zRxOXTHz0QIAaeA",
"reason": {
"type": "query_parsing_exception",
"reason": "[_na] query malformed, no field after start_object",
"index": "quote-lanes2",
"line": 13,
"col": 15
}
}
]
},
"status": 400
}
有什么建议?或者对文档的详细说明?
在此先感谢各位!
编辑:
因此,由于 @or-weinberger,查询得到了修复。 ,但它实际上并没有过滤日期。我将“查询”更改为“validFrom”,以便我的查询如下所示:
{
"size": 50,
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"or": [
{
"term": {
"fromPlace": "liverpool"
}
},
{
"range": {
"validFrom": {
"gte": "2017-03-22T08:43:11",
"format": "strict_date_optional_time||epoch_millis"
}
}
}
]
}
}
}
}
GTE 显然是 future 的,不应该匹配具有以下值的文档(但它确实如此):
我的日期字段正确映射为日期字段:
理想情况下,我只想过滤“yyyy/mm/dddd”部分。
有任何想法吗?
最佳答案
您的查询确实格式错误,过滤器应该在 bool
下应该在 query
下的元素元素。另外,当使用 or
时/and
您应该为每个过滤器元素(范围/术语等)创建单独的对象,例如:
{
"size": 50,
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"or": [
{
"term": {
"fromPlace": "liverpool"
}
},
{
"range": {
"query": {
"gte": "01/01/2012",
"lte": "2013",
"format": "dd/MM/yyyy||yyyy"
}
}
}
]
}
}
}
}
关于date - Elasticsearch 或 term 与日期范围相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954391/