# Field Collapsing 字段折叠

> 5.3 新增

允许基于字段对结果进行折叠。折叠操作是通过每个选择每个折叠键的顶部文档来实现的。例如下面的query获取每个user的最佳tweet并且根据他们的likes数量排序。

```
GET /twitter/tweet/_search
{
    "query": {
        "match": {
            "message": "elasticsearch"
        }
    },
    "collapse" : {
        "field" : "user"  # 1
    },
    "sort": ["likes"],  # 2
     "from": 10  # 3
}
```

| 1 | 使用user字段来折叠结果集      |
| - | ------------------- |
| 2 | 按照likes数量进行排序获取顶部文档 |
| 3 | 定义第一个折叠结果的偏移量       |

**警告：**&#x54CD;应结果中的hits总数表示匹配的文档总数而不是折叠的，去重后的聚合总数是未知的。

用于折叠的字段必须是单值的[keyword](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/keyword.html)或[numeric](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/number.html)字段并开启[doc\_values](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/doc-values.html)（文档值）。

**注意：** 折叠只应用于顶部文档，而且不会影响聚合。

## 扩大折叠的显示结果

它也可以通过*inner\_hits*参数来扩大每个折叠的顶部文档。

```
GET /twitter/tweet/_search
{
    "query": {
        "match": {
            "message": "elasticsearch"
        }
    },
    "collapse" : {
        "field" : "user", # 1
        "inner_hits": {
            "name": "last_tweets", # 2
            "size": 5,   # 3
            "sort": [{ "date": "asc" }] #４
        },
        "max_concurrent_group_searches": 4　＃5
    },
    "sort": ["likes"]
}
```

[![](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/images/icons/callouts/1.png)](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-collapse.html#CO28-1) 使用"user"字段折叠结果集

[![](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/images/icons/callouts/2.png)](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-collapse.html#CO28-2) name参数用来分割结果响应中的inner\_hits

[![](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/images/icons/callouts/3.png)](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-collapse.html#CO28-3) 每个折叠内inner\_hits检索到的数目

[![](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/images/icons/callouts/4.png)](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-collapse.html#CO28-4) 每个分组的排序方式

[![](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/images/icons/callouts/5.png)](https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-collapse.html#CO28-5) 每个分组内允许检索inner\_hits的并发请求数量

查看[inner hits](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-request-inner-hits.html)对于所支持的选项的完整列表和响应的格式。

该分组的扩展是通过向响应中返回的每个折叠的命中发送一个额外的查询来完成的。请求参数`max_concurrent_group_searches`可用于控制这个阶段并发搜索的最大数量。默认值是基于数据节点的数量和默认的搜索线程池大小。

**警告：**`collapse(折叠)不能用于与`[`scroll`](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-request-scroll.html)`,`[`rescore`](http://cwiki.apachecn.org/display/Elasticsearch/Rescoring)`,`[`search after`](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-request-search-after.html)`一同使用。`
