query_string和range同时出现

Mis*_*iev 3 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"}}}}
Run Code Online (Sandbox Code Playgroud)

但ES给了我这个错误:

ElasticsearchParseException[Expected field name but got START_OBJECT \"range\"];
Run Code Online (Sandbox Code Playgroud)

如果我删除range或者query_string,它工作得很好,但没有太多需要的过滤:)

Tho*_*asC 6

根据您的说法,您似乎希望组合多个查询以减少计算聚合的范围.

首先,这可以使用bool查询(文档)来实现,该查询允许您决定文档是否必须匹配两个查询(请参阅must子句)或至少一个查询(请参阅should子句).

假设您希望结果文档与两个查询匹配,语法将为:

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            ...
          }
        },
        {
          "range": {
            ...
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将有效,但这不是查询的最佳方式.它可以优化,因为您的range查询具有等效的过滤器.

使用过滤器版本通常会更快,因为它将跳过分数计算,并将达到大多数过滤器类型的缓存(有关查询和过滤器之间差异的更多信息).

但是,过滤器不能直接在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"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


TZH*_*ZHX 5

我相信,你想要这样的东西:

{
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "time": {
                            "gt": "2014-11-01T00:00:00Z",
                            "lte": "2014-11-01T03:00:00Z"
                        }
                    }
                },
                {
                    "query_string": {
                        "query": "field1:value1"
                    }
                }
            ]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Elasticsearch 似乎不允许您在单个“查询”标签下将多个事物链接在一起。

(抱歉格式化,我不能让{看起来漂亮和排队。)