如何在同一查询中同时拥有 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
,它工作得很好,但没有非常需要的过滤:)
最佳答案
从您所说的来看,您似乎想要组合多个查询以减少计算聚合的范围。
首先,这可以使用 bool
查询 ( documentation ) 来实现,它让您决定文档是否必须匹配两个查询(请参阅 must
子句)或至少一个查询(参见 should
子句)。
假设您希望结果文档匹配两个 查询,语法为:
{
"query": {
"bool": {
"must": [
{
"query_string": {
...
}
},
{
"range": {
...
}
}
]
}
}
}
这会起作用,但这不是最佳的查询方式。它可以优化,因为您的 range
查询具有等效的过滤器。
使用过滤器版本通常会更快,因为它会跳过分数计算,并且会命中大多数过滤器类型的缓存(有关 differences between queries and filters here 的更多信息)。
但是,过滤器不能直接在 query
属性中使用,您必须将其包装在具有两个属性的 filtered
查询中:
query
: 要过滤的queryfilter
:与您的查询结合的过滤器
最后,您将有一个这样的查询:
{
"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"
}
}
}
}
关于rest - 同时查询字符串和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280660/