如何在同一个查询中同时拥有query_string
和range
?
我发送给/myindex/mytype/_search/?search_type=count
:
{"query": {"query_string": {"query": "field1:value1"},
"range": {"time": {"gt": "2014-11-01T00:00:00Z",
"lte": "2014-11-01T03:00:00Z"}}},
"aggs": {"counts": {"date_histogram": {"field": "time",
"interval": "minute"}}}}
但ES给了我这个错误:
ElasticsearchParseException[Expected field name but got START_OBJECT \"range\"];
如果我删除了range
或query_string
,它的工作正常,但没有太多需要的过滤:)
答案 0 :(得分:6)
根据您的说法,您似乎希望合并多个查询以减少计算聚合的范围。
首先,这可以使用bool
查询(documentation)来实现,该查询可让您确定文档是否必须与两个查询匹配(请参阅must
子句)或至少一个查询(参见should
子句)。
我们假设您希望结果文档与两个查询相匹配,语法为:
{
"query": {
"bool": {
"must": [
{
"query_string": {
...
}
},
{
"range": {
...
}
}
]
}
}
}
这会有效,但这不是查询的最佳方式。它可以进行优化,因为range
查询具有等效过滤器。
使用过滤器版本通常会更快,因为它会跳过分数计算,并且会针对大多数过滤器类型点击缓存(有关differences between queries and filters here的更多信息)。
但是,过滤器无法直接在query
属性中使用,您必须将其包装在具有两个属性的filtered
查询中:
query
:要过滤的查询filter
:与您的查询结合使用的过滤器最后,您将收到类似这样的查询:
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "field1:value1"
}
},
"filter": {
"range": {
"time": {
"gt": "2014-11-01T00:00:00Z",
"lte": "2014-11-01T03:00:00Z"
}
}
}
}
},
"aggs": {
"counts": {
"date_histogram": {
"field": "time",
"interval": "minute"
}
}
}
}
答案 1 :(得分:4)
我相信,你想要的东西如下:
{
"query": {
"bool": {
"must": [
{
"range": {
"time": {
"gt": "2014-11-01T00:00:00Z",
"lte": "2014-11-01T03:00:00Z"
}
}
},
{
"query_string": {
"query": "field1:value1"
}
}
]
}
}
}
Elasticsearch似乎并没有让你在单个"查询"标签
(抱歉格式化,我不能让{
看起来很漂亮并排成一行。)
答案 2 :(得分:0)
对于docs,现在可以仅使用query_string
参数来执行此操作,如下所示:
{
"query_string": {
"query": "field1:value1 AND time:[2014-11-01T00:00:00Z TO 2014-11-01T03:00:00Z]"
}
}