以下查询产生结果:
GET /sentinel/pingback/_search
{
"match_all": {}
}
我想微调query
以添加时间范围
GET /sentinel/pingback/_search
{
"query": {
"range": {
"time": {
"gte": "now-20m"
}
},
"match_all": {}
}
}
这不再起作用,错误是
"error": {
"root_cause": [
{
"type": "parse_exception",
"reason": "failed to parse search source. expected field name but got [START_OBJECT]"
}
],
(...)
然而,时间范围正确地适用于
GET /sentinel/pingback/_search
{
"query": {
"range": {
"time": {
"gte": "now-20m"
}
}
}
}
因此我期待一个query
我可以添加独立的“微调”组件(例如range
),但显然它不会这样工作。
如何组合这些查询约束?
注意:我知道我可以在上面的查询中删除match_all
。我想保留它,因为它可能是match_all
或match
(这是我希望添加到无所不包的query
答案 0 :(得分:1)
您可以使用bool查询组合约束:
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
但我不明白为什么要将match_all与匹配查询结合起来。对我来说真的没有意义。
编辑:
如果您想匹配每个文档或过滤特定值的一个字段值,您应该使用编程语言,例如javascript。
匹配将匹配一个值,如名称所示。如果您想查找完全匹配,请查看术语查询(取决于您的ES版本以及< 2.0的术语过滤器。)
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
然后,如果没有选择过滤器,只需执行match_all,否则将查询json与术语查询一起构建。如果您有多个约束,请使用bool查询将它们组合在一起。
对于多种编程语言,还有查询构建器库, 例如对于javascript(官方的):
https://www.npmjs.com/package/elasticsearch
基本上,从逻辑角度看,查询的工作方式与其他数据库相同,只是语法不同。
答案 1 :(得分:0)
基于Nilz11's answer,我发现了如何解决问题。关键(据我所知)是收集if ($_SERVER['REQUEST_URI'] == '/index.php/locations/') {
中的所有约束。
在我的例子中:
bool
的:
match_all
用于特定匹配(例如名称):
{
"query": {
"bool": {
"must": [
{
"range": {
"time": {
"gte": "now-10m"
}
}
},
{
"match_all": {}
}
]
}
}
}