2014-11-03 65 views
1

在某些情况下,我不需要响应json中的所有字段。更改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" ] }可以帮助忽略/排除hits块中的_source字段。

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

回答

1

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

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

在做聚合,可以使用search_typedocumentation)参数与count值是这样的:

GET index/type/_search?search_type=count 

它不会返回任何文档,但只有结果数,你的聚合将在完全相同的方式来计算。

+0

我找到'“大小”:0'也就像'SEARCH_TYPE = count'。 – jasonz 2014-11-03 09:01:14

+0

如何改变结构? 类似于: “fields”:[“fieldName1”:{“fieldName2”,etc ...}] 这可能吗? – Maxrunner 2015-03-06 14:37:21

+0

您将无法直接在ElasticSearch中执行操作:这必须在客户端完成。 – ThomasC 2015-03-07 11:13:31

1

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

例如。

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

这减少(在我的情况)响应大小的一半,而不显著增加搜索时间,所以很值得..