query_string和range同时出现

时间:2015-02-02 15:06:14

标签: rest elasticsearch

如何在同一个查询中同时拥有query_stringrange

我发送给/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\"];

如果我删除了rangequery_string,它的工作正常,但没有太多需要的过滤:)

3 个答案:

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