在Elasticsearch中在多个日期上具有多个范围的查询 [英] Query in elasticsearch with multiple ranges on multiple dates
问题描述
以下 range_query 返回的结果为预期:
The following range_query returns a result as expected:
{"query": {
"bool": {
"must": [
{
"range": {
"created_at": {
"gte": "2013-12-09"
}
}
}
]
}
}
}
但将几个范围查询加在一起,则不会返回任何内容:
But and-ing together several range queries, returns nothing:
{"query": {
"bool":{
"must": [
{
"and": [
{
"range": {
"created_at": {
"gte": "2013-12-09"
}
}
},
{
"range": {
"happens_on": {
"lte": "2013-12-16"
}
}
},
{
"range": {
"created_at": {
"lte": "2013-12-14"
}
}
}
]
}
]
}
}
}
在多个字段上使用多个range_queries的正确方法是什么?
What is the correct way to use multiple range_queries on multiple fields?
编辑:啊,好的,这就是我使用range_filter而不是range_query的地方吗?这听起来很有希望,所以我仅使用一个范围过滤器重新编写了查询。如果我在其他地方弄乱了查询,请将所有内容都张贴在这里。我正在执行GET,并且源密钥中的所有内容实际上都是JSON,但我删除了转义符以提高可读性:
Ah, ok, so this is where I use a range_filter as opposed to range_query? This sounded promising, so I re-wrote my query using only a single range filter. Posting all of it here, in case I'm messing up the query someplace else. I'm performing a GET, and everything inside the source key is actually JSON, but I removed the escaped the hyphens for readability:
{
"source": {
"filtered": {
"filter": {
"and": [
{
"term": {
"restricted": false
}
},
{
"not": {
"term": {
"deleted": true
}
}
},
{
"range": {
"happens_on": {
"lte": "2013-12-16"
}
}
}
]
},
"query": {
"bool": {
"must": [
]
}
}
},
"from": 0,
"size": 10
}
}
很遗憾,我的问题仍然相同:我没有收到任何点击。
Regrettably, my problem is still the same: I'm not getting any hits.
EDIT2 :因此,沿着Njal建议的must子句中的范围胡同走下去。这给了我一个这样的多范围查询:
So, going down the alley of ranges inside a must clause like Njal suggested. This gives me a multi-range query like this:
{
"source": {
"filter": {
"and": [
{
"term": {
"restricted": false
}
},
{
"not": {
"term": {
"deleted": true
}
}
}
]
},
"from": 0,
"query": {
"bool": {
"must": [
{
"range": {
"happens_on": {
"gte": "2013-12-06"
}
}
},
{
"range": {
"created_at": {
"gte": "2013-12-15"
}
}
},
{
"range": {
"happens_on": {
"lte": "2013-12-17"
}
}
},
{
"range": {
"created_at": {
"lte": "2013-12-17"
}
}
}
]
}
},
"size": 10
}
}
仍然没有返回结果。我在这里犯任何明显的错误吗?
Still no results returned. Am I doing any obvious mistakes here?
推荐答案
在您的 bool
查询下'必须
子句,无需将其包装在和
中。没有和
查询,也许您在考虑并过滤?
Under your bool
queries' must
clause there's no need to wrap it in an and
. There is no and
query, maybe you were thinking of the and filter?
为方便起见,示例可运行播放作为curl命令:
#!/bin/bash
export ELASTICSEARCH_ENDPOINT="http://localhost:9200"
# Create indexes
curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
"settings": {},
"mappings": {
"type": {
"properties": {
"created_at": {
"type": "date",
"format": "dateOptionalTime"
},
"name": {
"type": "string"
},
"happens_on": {
"type": "date",
"format": "dateOptionalTime"
}
}
}
}
}'
# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"name":"foo","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"}
{"index":{"_index":"play","_type":"type"}}
{"name":"bar","created_at":"2013-12-08T00:00:00.000Z","happens_on":"2013-12-16T00:00:00.000Z"}
{"index":{"_index":"play","_type":"type"}}
{"name":"bar","created_at":"2013-12-09T00:00:00.000Z","happens_on":"2013-12-17T00:00:00.000Z"}
'
# Do searches
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"bool": {
"must": [
{
"range": {
"created_at": {
"gte": "2013-12-09T00:00:00.000Z"
}
}
},
{
"range": {
"happens_on": {
"lte": "2013-12-16T00:00:00.000Z"
}
}
}
]
}
}
}
'
这篇关于在Elasticsearch中在多个日期上具有多个范围的查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!