如何微调match_all查询?

时间:2016-07-27 10:27:51

标签: elasticsearch

以下查询产生结果:

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_allmatch(这是我希望添加到无所不包的query

的另一个约束

2 个答案:

答案 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": {}
            }
         ]
      }
   }
}