更改ElasticSearch响应json的结构

时间:2014-11-03 06:51:06

标签: elasticsearch

在某些情况下,我不需要响应json中的所有字段。

例如,

// request json
{
  "_source": "false",
  "aggs": { ... },
  "query": { ... }
}

// response json
{
  "took": 123,
  "timed_out": false,
  "_shards": { ... },
  "hits": {
    "total": 123,
    "max_score": 123,
    "hits": [
      {
        "_index": "foo",
        "_type": "bar",
        "_id": "123",
        "_score": 123
      }
    ],
    ...
  },
  "aggregations": {
    "foo": {
      "buckets": [
        {
          "key": 123,
          "doc_count": 123
        },
        ...
      ]
    }
  }
}

实际上我每次都不需要_index / _type。当我进行聚合时,我不需要hits阻止。

"_source" : false"_source": { "exclude": [ "foobar" ] }可以帮助忽略/排除_source块中的hits字段。

但是我能以更常见的方式更改ES响应json的结构吗?感谢。

2 个答案:

答案 0 :(得分:2)

我最近需要"减肥" Elasticsearch响应,因为它在json中超过1MB,我开始使用filter_path请求变量。 这允许包含或排除特定字段,并且可以具有不同类型的通配符。请阅读上面链接中的文档,因为那里有相当多的信息。

例如

_search?filter_path=aggregations.**.hits._source,aggregations.**.key,aggregations.**.doc_count

这减少了(在我的情况下)响应大小减半而没有显着增加搜索持续时间,所以值得努力..

答案 1 :(得分:1)

hits部分,您将始终点击_index_type_id字段。如果您只想检索搜索结果中的某些特定字段,可以在根对象中使用fields参数:

{
  "query": { ... },
  "aggs": { ... },
  "fields":["fieldName1","fieldName2", etc...]
}

进行聚合时,您可以将search_typedocumentation)参数与count值一起使用,如下所示:

GET index/type/_search?search_type=count

它不会返回任何文档,只返回结果计数,您的聚合将以完全相同的方式计算。