rest - 同时查询字符串和范围

标签 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,它工作得很好,但没有非常需要的过滤:)

最佳答案

从您所说的来看,您似乎想要组合多个查询以减少计算聚合的范围。

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

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

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            ...
          }
        },
        {
          "range": {
            ...
          }
        }
      ]
    }
  }
}

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

使用过滤器版本通常会更快,因为它会跳过分数计算,并且会命中大多数过滤器类型的缓存(有关 differences between queries and filters here 的更多信息)。

但是,过滤器不能直接在 query 属性中使用,您必须将其包装在具有两个属性的 filtered 查询中:

  • query : 要过滤的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"
      }
    }
  }
}

关于rest - 同时查询字符串和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28280660/

相关文章:

elasticsearch - ElasticSearch 'range'查询返回不合适的结果

Elasticsearch Completion Suggester 不会返回与输入匹配的搜索文档

c# - 使用 NEST 使用 linq 查询 Elasticsearch

rest - ASP.NET Web Api 重复动词

javascript - Nodejs Restful api 验证方法

php - Laravel 5 Dingo API Controller

rest - 创建具有关系的 REST 端点的正确方法是什么

forms - Symfony2 表单验证错误返回 HTTP 代码 '200'

django - 通过整数字段在 Elasticsearch_dsl 中进行范围查询

elasticsearch - Elasticsearch River Web集成