# 分群管理

## 1. 创建分群 <a href="#id-4-huo-qu-suo-you-yong-hu-fen-qun-lie-biao" id="id-4-huo-qu-suo-you-yong-hu-fen-qun-lie-biao"></a>

通过分群规则创建分群。在 4.5.0 版本中新增。‌

### 1.1 接口地址 <a href="#id-41-jie-kou-di-zhi" id="id-41-jie-kou-di-zhi"></a>

> 【POST】 /uba/api/cohort

### 1.2 请求参数示例 <a href="#id-42-qing-qiu-can-shu-shi-li" id="id-42-qing-qiu-can-shu-shi-li"></a>

```java
{
    //分群名称，不允许重复
    "name": "apitest1",
    //动态分群
    "dynamic": 0,
    //分群创建规则
    "content": {
        "ruleGroup":[],
        "relations":[]
    }
}
```

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://app.gitbook.com/@analysys/s/ark/~/drafts/-LoxLQTQwGY5HTZzArUH/primary/integration/api#21-xiang-mu-jie-kou-ren-zheng)。
>
> **操作用户**：通过API创建的分群默认为API所有，不属于任何用户，如果想让某个用户在页面上对此分群进行操作，需要在URL上带loginUser参数，详情见 [操作用户](https://arkdocs.analysys.cn/integration/api/..#51-cao-zuo-yong-hu)。

#### 1.2.1 入参说明 <a href="#id-4-2-1-ru-can-shuo-ming" id="id-4-2-1-ru-can-shuo-ming"></a>

| 参数名称    | 类型     | 必填 | 说明                                                | 枚举               |
| ------- | ------ | -- | ------------------------------------------------- | ---------------- |
| name    | String | Y  | 分群名称，不能重复                                         |                  |
| dynamic | int    | Y  | <p>1：为动态分群 每日凌晨计算一次</p><p>0：静态分群 在创建分群的时候计算一次</p> | <p>1</p><p>0</p> |
| content | Json   | Y  | 分群创建规则                                            |                  |

#### 1.2.2 创建规则说明

分群规则是多层嵌套的结构，以下针对于分群规则详情说明。

**一、规则组装**

content里面存放的是分群规则和规则之间的关系，可自由组装。

```java
"content":{
    //规则，可以是多个
    "ruleGroup":[
        {
            "rules":[
                {
                    ...
                }
            ],
            "relation":"AND"
        }
    ],
    //规则之间的逻辑关系，当前支持且和非。 且：AND，非：AND_NOT
    "relations":[
        "AND"
    ]
}
```

{% hint style="info" %}
**规则之间的关系定位为集合类型，是为了支持规则之间的多种关系，使用如下：**

**1、r**elations **为空**，规则之间之间逻辑关系**默认**为 **且**。

2、relations 1个值，规则之间都使用相同逻辑关系。

3、relations 大于1个值，在规则个数大于2时使用，表示第N个和第N+1个规则之间的逻辑关系。即 relations.size = ruleGroup.size -1。
{% endhint %}

**二、规则定义**

ruleGroup 存放的规则内容的集合以及间的逻辑关系

```java
{
    "ruleGroup":{
        "rules":[
            ...
        ],
        //规则内容之间的逻辑关系，当前支持 AND/OR 两种
        "relation":"AND"
    }
}
```

**三、规则内容**

规则内容当前支持用户属性规则和事件规则两种。

**用户属性规则**

```java
{
    //【必填】user表示为用户属性规则
    "type":"user", 
    //【必填】用户属性表达式
    "expression":"user.$email",  
    //【必填】操作符，和属性数据类型相关
    "function":"NOT_EQ",  
    // 规则条件值，根据不同的操作符可以有一个或多个，数组
    "params":["XX"] 
}
```

以上表示的意思是：获取 **用户邮箱不等于XX** 的用户。

> **参数说明：**
>
> * **expression：**&#x7528;来指定具体事件/事件属性，更多介绍参照 [用户属性表达式](https://arkdocs.analysys.cn/integration/api-analytics#2-1-2-shu-xing-biao-da-shi)。
> * **function：**&#x805A;合操作符操作符，根据不同数据类型支持不同操作符，具体参考 [条件操作符号](https://arkdocs.analysys.cn/integration/api-analytics#2-2-2-tiao-jian-cao-zuo-fu-hao)。
> * **filter：**&#x4E8B;件的过滤条件，具体参考 [过滤条件](https://arkdocs.analysys.cn/integration/api-analytics#22-guo-lv-tiao-jian)。

**事件规则**

```java
{
    //【必填】event表示为事件规则
    "type":"event",
    //【必填】事件表达式/事件属性表达式
    "expression":"event.$startup",
    //【必填】事件发生的时间范围，和 eventRelativeTimeParam二选一.如果两个都传了会以eventAbsoluteTimeParams为准
    "eventAbsoluteTimeParams":["2019-09-12","2019-09-18"],
    //【必填】聚合操作符 如果是事件指定为触发次数：TOTAL_COUNT，如果是属性指定为去重数：REMOVE_DUMPLICATE
    "aggregator":"TOTAL_COUNT",
    //【必填】触发次数/去重数使用的操作符
    "function":"GTE",
    //触发次数/去重数满足的条件值
    "params":[
        "1"
    ],
    //针对于这个事件的具体过滤条件
    "filter":{
        ...
    }
}
```

以上表示的意思是：获取 **2019-09-12到2019-09-18内启动次数大于1** 的用户。

> **参数说明：**
>
> * **expression：**&#x7528;来指定具体事件/事件属性，更多介绍参照 [表达式](https://arkdocs.analysys.cn/integration/api-analytics#21-biao-da-shi)。
> * **eventAbsoluteTimeParams：**&#x4E8B;件发生的时间范围，绝对时间，**数组**（length=2），内容格式为yyyy-MM-dd。
> * **eventRelativeTimeParam：**&#x4E8B;件发生的时间范围，相对时间，在创建动态分群时使用。需要按照指定格式传入，如近七日：6,0,day，过去七日：7,1,day，今日：0 day。
> * **aggregator：**&#x805A;合操作符，分群中只支持两种：
>   * **事件的触发次数：TOTAL\_COUNT**&#x20;
>   * **事件属性的去重数：REMOVE\_DUMPLICATE**
> * **function：**&#x805A;合操作符操作符，和数值类型的运算符一致（但**不支持** NOT\_NULL 和 NULL），具体参考 [条件操作符号](https://arkdocs.analysys.cn/integration/api-analytics#2-2-2-tiao-jian-cao-zuo-fu-hao)。
> * **filter：**&#x4E8B;件的过滤条件，具体参考 [过滤条件](https://arkdocs.analysys.cn/integration/api-analytics#22-guo-lv-tiao-jian)。

### 1.3 返回结果示例 <a href="#id-43-fan-hui-jie-guo-shi-li" id="id-43-fan-hui-jie-guo-shi-li"></a>

```java
‌{
    "id": 2,
    "code": "arkfq_2",
    "name": "test",
    "dynamic": 1,
    "createTime": "2019-09-12 11:53:24",
    "content": {...}
}
```

### 1.4 接口调用示例 <a href="#id-44-jie-kou-tiao-yong-shi-li" id="id-44-jie-kou-tiao-yong-shi-li"></a>

```java
curl -H "Content-Type:application/json" -H "token:4113c9cad1c301113783f433e254888c" -H "appKey:31abd9593e9983ec" -X POST --data '{
	"name":"apiTest02",
	"dynamic":0,
	"content":{
	    "ruleGroup":[
	        {
	            "rules":[
	                {
	                    "type":"user",
	                    "expression":"user.xwho",
	                    "function":"NOT_NULL",
	                    "params":[
	
	                    ]
	                },
	                {
	                    "type":"user",
	                    "expression":"user.$email",
	                    "function":"NOT_EQ",
	                    "params":[
	                        "xx1",
	                        "xx2"
	                    ]
	                },
	                {
	                    "type":"user",
	                    "expression":"user.$signup_time",
	                    "function":"RELATIVE_TIME_OF_CUURENT",
	                    "params":[
	                        "30",
	                        "day",
	                        "within"
	                    ]
	                }
	            ],
	            "relation":"AND"
	        },
	        {
	            "rules":[
	                {
	                    "type":"event",
	                    "expression":"event.$startup",
	                    "eventAbsoluteTimeParams":[
	                        "2019-09-09",
	                        "2019-09-15"
	                    ],
	                    "aggregator":"TOTAL_COUNT",
	                    "function":"GTE",
	                    "params":[
	                        0
	                    ]
	                }
	            ],
	            "relation":"AND"
	        }
	    ],
	    "relations":[
	        "AND"
	    ]
	}
}' http://127.0.0.1:4005/uba/api/cohort
```

## 2. 获取单个用户分群信息

获取单个用户分群信息。在 4.5.0 版本中新增。

### 2.1 接口地址

> 【GET】 /uba/api/cohort/{id}

### 2.2 请求参数示例

```java
?needMore=false
```

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://arkdocs.analysys.cn/integration/api/..#21-xiang-mu-jie-kou-ren-zheng)。

#### 2.2.1 入参说明

| 参数名称     | 类型      | 必填 | 说明                                          | 枚举                      |
| -------- | ------- | -- | ------------------------------------------- | ----------------------- |
| id       | Long    | Y  | 分群ID                                        |                         |
| needMore | Boolean | N  | <p>是否需要分群的详细信息。</p><p>备注：URL传参，默认为false</p> | <p>true</p><p>false</p> |

### 2.3 返回结果示例

```java
{
    //分群id 在操作某个分群时使用
    "id": 2,
    //分群code 在查询用户详情时需要用到分群时都通过code来筛选
    "code": "arkfq_2",
    //分群名称，用户页面定义
    "name": "test",
    //动态分群 1为动态分群 每日凌晨计算一次
    "dynamic": 1,
    //当前分群的用户数
    "userNumber": 992,
    //分群状态 success：成功，failed：失败，calculating：计算中
    "status": "success",
    //分群最后一次计算时间 
    "calculatedTime": "2019-09-12 11:53:29"
}
```

如果URL上传参 needMore=true，则返回参数中会多一下内容：

```java
{
    //分群来源 自定义分群是通过分群模块选择规则创建
    "source": "自定义分群",
    //创建时间
    "createdTime": "2019-09-12 11:53:24",
    //创建人
    "createdUser": "管理员",
    //最后更新时间
    "updatedTime": "2019-09-12 11:53:29",
    //分群规则内容
    "content": {...}
}
```

### 2.4 接口调用示例

```java
curl -H "token:1b554f363d56238bf33a201620f2e9a9" -H "appKey:31abd9593e9983ec" http://127.0.0.1:4005/uba/api/cohort/2?needMore=false
```

## 3. 获取所有用户分群列表

获取某个项目下所有的用户分群列表。在 4.3.5 版本中新增。

### 3.1 接口地址

> 【GET】 /uba/api/cohort

### 3.2 请求参数示例

```java
//4.5.0 版本中才支持输入参数过滤
?needMore=true&status=success
```

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://arkdocs.analysys.cn/integration/api/..#21-xiang-mu-jie-kou-ren-zheng)。

#### 3.2.1 入参说明

| 参数名称     | 类型      | 必填 | 说明                                                       | 枚举                                            |
| -------- | ------- | -- | -------------------------------------------------------- | --------------------------------------------- |
| needMore | Boolean | N  | <p>是否需要分群的详细信息。</p><p>备注：URL传参，默认为false</p>              | <p>true</p><p>false</p>                       |
| status   | String  | N  | <p>分群计算状态。成功、失败、计算中三种状态。</p><p>备注：URL传参，不传为获取所有状态分群。</p> | <p>success</p><p>failed</p><p>calculating</p> |

### 3.3 返回结果示例

```java
[
    {
        //【4.5.0中新增】分群id 在操作某个分群时使用
        "id": 2,
        //分群code 在查询用户详情时需要用到分群时都通过code来筛选
        "code": "arkfq_2",
        //分群名称，用户页面定义
        "name": "test",
        //动态分群 1为动态分群 每日凌晨计算一次
        "dynamic": 1,
        //当前分群的用户数
        "userNumber": 992,
        //【4.5.0中新增】分群状态 success：成功，failed：失败，calculating：计算中
        "status": "success",
        //【4.5.0中新增】分群最后一次计算时间 
        "calculatedTime": "2019-09-12 11:53:29",
        //----------以下输出字段在needMore=true时才会返回------------//
        //【4.5.0中新增】分群来源 自定义分群是通过分群模块选择规则创建
        "source": "自定义分群",
        //【4.5.0中新增】创建时间
        "createdTime": "2019-09-12 11:53:24",
        //【4.5.0中新增】创建人
        "createdUser": "管理员",
        //【4.5.0中新增】最后更新时间
        "updatedTime": "2019-09-12 11:53:29",
        //【4.5.0中新增】分群规则内容
        "content": {}
    },
    {
        "id": 5,
        "code": "arkfq_5",
        "name": "test",
        //0为静态分群 在创建分群的时候计算一次
        "dynamic": 0,
        "userNumber": 22,
        "status": "success",
        "calculatedTime": "2019-09-15 13:53:29",
        //分群来源，分析下钻分群通过个分析模块下钻创建，下钻的分群不返回规则内容
        "source": "分析下钻分群",
        "createdTime": "2019-09-15 13:53:24",
        "createdUser": "管理员",
        "updatedTime": "2019-09-15 13:53:29",
        "content": ""
    }
]
```

### 3.4 接口调用示例

```java
curl -H "token:1b554f363d56238bf33a201620f2e9a9" -H "appKey:31abd9593e9983ec" http://127.0.0.1:4005/uba/api/cohort?needMore=true&status=success
```

## 4. 重新计算单个分群

静态分群只在创建的时候计算一次，如果创建后有数据更新，可以调用接口重新计算一次分群。在 4.5.0 版本中新增。

### 4.1 接口地址

> 【POST】 /uba/api/cohort/{id}/recalculate

### 4.2 请求参数示例

无

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://arkdocs.analysys.cn/integration/api/..#21-xiang-mu-jie-kou-ren-zheng)。

#### 4.2.1 入参说明

| 参数名称 | 类型   | 必填 | 说明   | 枚举 |
| ---- | ---- | -- | ---- | -- |
| id   | Long | Y  | 分群ID |    |

### 4.3 返回结果示例

```java
{
    //人群ID
    "id": 2,
    //分群状态
    "status": "calculating"
}
```

### 4.4 接口调用示例

```java
curl -H "token:1b554f363d56238bf33a201620f2e9a9" -H "appKey:31abd9593e9983ec" -X POST http://127.0.0.1:4005/uba/api/cohort/2/recalculate
```

## 5. 删除单个分群

当前用户分群规则是只能删除自己创建的分群，如果API不带loginUser参数只能删除通过API创建并且未带loginUser的分群。如果带loginUser参数，就能删除对应用户创建的分群。在 4.5.0 版本中新增。

### 5.1 接口地址

> 【DELETE】 /uba/api/cohort/{id}

### 5.2 请求参数示例

无

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://arkdocs.analysys.cn/integration/api/..#21-xiang-mu-jie-kou-ren-zheng)。
>
> **操作用户**：通过API默认只能删除属于API的分群，如果需要删除某个用户的分群，需要在URL上带loginUser参数，详情见 [操作用户](https://arkdocs.analysys.cn/integration/api/..#51-cao-zuo-yong-hu)。

#### 5.2.1 入参说明

| 参数名称 | 类型   | 必填 | 说明   | 枚举 |
| ---- | ---- | -- | ---- | -- |
| id   | Long | Y  | 分群ID |    |

### 5.3 返回结果示例

```java
{
    //返回success说明接口调用成功
    "success":0
}
```

### 5.4 接口调用示例

```java
curl -H "token:1b554f363d56238bf33a201620f2e9a9" -H "appKey:31abd9593e9983ec" -X DELETE http://127.0.0.1:4005/uba/api/cohort/2
```

## 6. 上传用户属性创建分群

通过上传某一个用户属性的数据文件，用文件中的数据作为对应属性的条件去筛选，将符合条件的用户保存为为一个用户群。在 5.2 版本中新增。‌

### **6.1 接口地址**

> 【POST】 /uba/api/cohort/byfile

### 6.2 请求参数示例\*\*

form-data传参

| 参数名称     | 类型     | 必填 | 说明                                               |
| -------- | ------ | -- | ------------------------------------------------ |
| name     | String | Y  | 分群名称，不能重复                                        |
| file     | file   | Y  | <p>上传的文件，只支持excel格式，</p><p>输入一列值，文件大小不能超过10M</p> |
| property | String | N  | 文件中值对应的属性，默认为xwho，只支持字符串类型的用户属性                  |

> **认证参数**：接口必传token和appKey两个参数，详情见 [项目接口认证](https://app.gitbook.com/@analysys/s/ark/~/drafts/-LoxLQTQwGY5HTZzArUH/primary/integration/api#21-xiang-mu-jie-kou-ren-zheng)。
>
> **操作用户**：通过API创建的分群默认为API所有，不属于任何用户，如果想让某个用户在页面上对此分群进行操作，需要在URL上带loginUser参数，详情见 [操作用户](https://arkdocs.analysys.cn/integration/api/..#51-cao-zuo-yong-hu)。

### 6.3 返回结果示例

```
{
    "id": 2,
    "code": "arkfq_2",
    "name": "广告投放成功用户",
    "dynamic": 0,
    "createTime": "2019-09-12 11:53:24"
}
```

### 6.4 接口调用示例

```java
public void createCohortByFile() throws IOException {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(API_HOST + "/uba/api/cohort/byfile");
        httpPost.setHeader("appKey", APP_KEY);
        httpPost.setHeader("token", APP_TOKEN);
​
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        //设置请求的编码格式
        builder.setContentType(ContentType.MULTIPART_FORM_DATA);
​
        //输入分群名称
        StringBody nameBody = new StringBody("99活动激活", ContentType.create("text/plain", Consts.UTF_8));
        builder.addPart("name", nameBody);
        //对应属性值
        builder.addBinaryBody("file", new File("/Users/yuan/Documents/data/ark/file/99激活用户ID.xlsx"));
        //指定属性列
        builder.addTextBody("property", "xwho");
        httpPost.setEntity(builder.build());
​
        //设置超时时间
        RequestConfig reqConfig = RequestConfig.custom().setSocketTimeout(30*60*1000).setConnectTimeout(60*1000).build();
        httpPost.setConfig(reqConfig);
​
        CloseableHttpResponse response = client.execute(httpPost);
        //获取响应状态
        int httpStatus = response.getStatusLine().getStatusCode();
        //获取响应内容
        HttpEntity responseEntity = response.getEntity();
        String reponseContent = EntityUtils.toString(responseEntity);
​
        EntityUtils.consume(responseEntity);
    }
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://arkdocs.analysys.cn/integration/api/api-cohort/api-cohort-base.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
