# Agent 搜索 API 文档
面向 agent 提供 pattern 数据库的分类树和元素查询接口

本文档包含三个搜索相关的 API 接口：

1. **关键词搜索** - 根据关键词搜索分类和元素
2. **获取分类树** - 获取指定分类的完整路径和子树
3. **获取全量元素** - 分页浏览元素，支持排序和筛选

---

## 接口 1：关键词搜索

### 接口地址

```
GET http://8.147.104.190:8001/api/agent/search
```

### 功能说明

搜索全局分类库中的分类（Category）和元素（Element），支持文本匹配、上下文扩展、平台筛选等功能。

## 请求参数

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| q | string | ✓ | - | 搜索关键词 |
| source_type | string | ✓ | - | 元素类型：`实质` / `形式` / `意图` |
| entity_type | string | ✗ | all | 搜索对象类型：`category`（分类）/ `element`（元素）/ `all`（全部） |
| top_k | integer | ✗ | 20 | 返回结果数量，范围 1-100 |
| use_description | boolean | ✗ | false | 是否在描述字段中搜索（true=搜索名称+描述，false=仅搜索名称） |
| execution_id | integer | ✗ | null | 按执行 ID 筛选（可选） |
| platform | string | ✗ | null | 按平台筛选元素（如：`小红书`、`抖音` 等），仅对元素有效 |
| include_ancestors | boolean | ✗ | false | 是否返回祖先路径（从根节点到父节点的完整路径） |
| descendant_depth | integer | ✗ | 0 | 返回 N 代以内的子孙节点，0=不返回，1=直接子节点，2=子节点+孙节点... |

## 返回格式

```json
{
  "success": true,
  "query": "搜索关键词",
  "source_type": "实质",
  "entity_type": "all",
  "count": 3,
  "results": [
    {
      "entity_type": "category",
      "entity_id": 123,
      "stable_id": 456,
      "name": "分类名称",
      "description": "分类描述",
      "path": "/一级分类/二级分类",
      "category_nature": "领域层级",
      "level": 2
    },
    {
      "entity_type": "element",
      "entity_id": 789,
      "name": "元素名称",
      "description": "元素描述",
      "category_path": "/一级分类/二级分类"
    }
  ]
}
```

### 返回字段说明

#### 通用字段
- `success`: 请求是否成功
- `query`: 搜索关键词
- `source_type`: 元素类型
- `entity_type`: 搜索对象类型
- `count`: 返回结果数量
- `results`: 结果列表

#### 结果对象字段（分类 Category）
- `entity_type`: 固定为 "category"
- `entity_id`: 分类数据库 ID
- `stable_id`: 分类稳定 ID（source_stable_id）
- `name`: 分类名称
- `description`: 分类描述
- `path`: 分类路径（如 `/主体/角色类型/人物角色`）
- `category_nature`: 分类性质（领域层级/元描述层级）
- `level`: 层级深度（1=根节点）

#### 结果对象字段（元素 Element）
- `entity_type`: 固定为 "element"
- `entity_id`: 元素数据库 ID
- `name`: 元素名称
- `description`: 元素描述
- `category_path`: 所属分类路径

---

## 使用示例

### 1. 基础搜索

#### 搜索所有（分类+元素）
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色" \
  --data-urlencode "source_type=实质"
```

#### 只搜索分类
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=主体" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category"
```

#### 只搜索元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=猫咪" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "entity_type=element"
```

#### 限制返回数量
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "top_k=5"
```

### 2. 扩展搜索范围

#### 搜索名称+描述
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=拟人" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "use_description=true"
```

### 3. 获取上下文信息

#### 返回祖先路径
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=人物角色" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category" \
  --data-urlencode "include_ancestors=true"
```

#### 返回1代子孙节点
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=主体" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category" \
  --data-urlencode "descendant_depth=1"
```

#### 返回2代子孙节点
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=主体" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category" \
  --data-urlencode "descendant_depth=2"
```

#### 同时返回祖先+子孙
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色类型" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category" \
  --data-urlencode "include_ancestors=true" \
  --data-urlencode "descendant_depth=2"
```

### 4. 平台筛选

#### 只搜索小红书平台的元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=element" \
  --data-urlencode "platform=小红书"
```

#### 搜索抖音平台的元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=主体" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "platform=抖音"
```

#### 平台筛选+描述搜索
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=拟人" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "platform=小红书" \
  --data-urlencode "use_description=true"
```

### 5. 组合查询

#### 全功能组合
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=all" \
  --data-urlencode "top_k=10" \
  --data-urlencode "use_description=true" \
  --data-urlencode "include_ancestors=true" \
  --data-urlencode "descendant_depth=1" \
  --data-urlencode "platform=小红书"
```

#### 不同 source_type 的搜索
```bash
# 搜索意图维度
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=情感" \
  --data-urlencode "source_type=意图"

# 搜索形式维度
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=视觉" \
  --data-urlencode "source_type=形式"
```

### 6. 浏览器直接访问

```
http://8.147.104.190:8001/api/agent/search?q=角色&source_type=实质
http://8.147.104.190:8001/api/agent/search?q=主体&source_type=实质&entity_type=category&include_ancestors=true&descendant_depth=2
http://8.147.104.190:8001/api/agent/search?q=猫咪&source_type=形式&platform=小红书
```

### 7. FastAPI 交互式文档

访问以下地址可以在网页上直接测试 API：

```
http://8.147.104.190:8001/docs
```

在文档页面找到 `/api/search` 接口，点击 "Try it out" 按钮，填写参数后点击 "Execute" 即可测试。

---

## 返回示例

### 示例 1：基础搜索

**请求：**
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色" \
  --data-urlencode "source_type=实质"
```

**响应：**
```json
{
  "success": true,
  "query": "角色",
  "source_type": "实质",
  "entity_type": "all",
  "count": 2,
  "results": [
    {
      "entity_type": "category",
      "entity_id": 123,
      "stable_id": 456,
      "name": "角色类型",
      "description": "内容主体的角色分类",
      "path": "/主体/角色类型",
      "category_nature": "领域层级",
      "level": 2,
      "score": 0.95,
      "scores": {
        "text": 0.95,
        "vector": 0.0
      }
    },
    {
      "entity_type": "element",
      "entity_id": 789,
      "name": "人物角色",
      "description": "真实或虚拟的人物形象",
      "belong_category_stable_id": 456,
      "occurrence_count": 25,
      "score": 0.88,
      "scores": {
        "text": 0.88,
        "vector": 0.0
      }
    }
  ]
}
```

### 示例 2：带祖先和子孙的搜索

**请求：**
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=角色类型" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "entity_type=category" \
  --data-urlencode "include_ancestors=true" \
  --data-urlencode "descendant_depth=2"
```

**响应：**
```json
{
  "success": true,
  "query": "角色类型",
  "source_type": "实质",
  "entity_type": "category",
  "count": 1,
  "results": [
    {
      "entity_type": "category",
      "entity_id": 123,
      "stable_id": 456,
      "name": "角色类型",
      "description": "内容主体的角色分类",
      "path": "/主体/角色类型",
      "category_nature": "领域层级",
      "level": 2,
      "score": 1.0,
      "scores": {
        "text": 1.0,
        "vector": 0.0
      },
      "ancestors": [
        {
          "stable_id": 1,
          "name": "主体",
          "level": 1
        }
      ],
      "descendants": [
        {
          "stable_id": 500,
          "name": "人物角色",
          "level": 3,
          "depth_from_parent": 1,
          "is_leaf": false
        },
        {
          "stable_id": 501,
          "name": "动物角色",
          "level": 3,
          "depth_from_parent": 1,
          "is_leaf": false
        },
        {
          "stable_id": 600,
          "name": "真人角色",
          "level": 4,
          "depth_from_parent": 2,
          "is_leaf": true
        },
        {
          "stable_id": 601,
          "name": "虚拟角色",
          "level": 4,
          "depth_from_parent": 2,
          "is_leaf": true
        }
      ]
    }
  ]
}
```

### 示例 3：平台筛选

**请求：**
```bash
curl -G "http://8.147.104.190:8001/api/agent/search" \
  --data-urlencode "q=猫咪" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "entity_type=element" \
  --data-urlencode "platform=小红书"
```

**响应：**
```json
{
  "success": true,
  "query": "猫咪",
  "source_type": "形式",
  "entity_type": "element",
  "count": 3,
  "results": [
    {
      "entity_type": "element",
      "entity_id": 1001,
      "name": "猫咪",
      "description": "可爱的猫咪形象",
      "belong_category_stable_id": 200,
      "occurrence_count": 15,
      "score": 1.0,
      "scores": {
        "text": 1.0,
        "vector": 0.0
      }
    },
    {
      "entity_type": "element",
      "entity_id": 1002,
      "name": "猫咪拟人",
      "description": "拟人化的猫咪角色",
      "belong_category_stable_id": 201,
      "occurrence_count": 8,
      "score": 0.85,
      "scores": {
        "text": 0.85,
        "vector": 0.0
      }
    }
  ]
}
```

---

## 错误处理

### 错误响应格式

```json
{
  "detail": "错误信息描述"
}
```

### 常见错误

| HTTP 状态码 | 错误原因 | 解决方法 |
|------------|---------|---------|
| 400 | 缺少必填参数（q 或 source_type） | 检查请求参数 |
| 400 | source_type 值不合法 | 使用 `实质`、`形式` 或 `意图` |
| 400 | entity_type 值不合法 | 使用 `category`、`element` 或 `all` |
| 400 | mode 不支持 | 当前仅支持 `text` 模式 |
| 500 | 服务器内部错误 | 联系技术支持 |

---

## 注意事项

1. **中文参数编码**：使用 curl 时，中文参数需要用 `--data-urlencode` 进行 URL 编码
2. **平台筛选限制**：`platform` 参数仅对元素（element）有效，对分类（category）无效
3. **性能考虑**：
   - `use_description=true` 会增加搜索范围，可能降低精确度
   - `descendant_depth` 越大，返回数据越多，响应时间越长
   - 建议 `top_k` 不超过 50
4. **搜索模式**：当前仅支持 `text` 模式，`vector` 和 `hybrid` 模式将在后续版本中支持
5. **平台名称**：`platform` 参数值需要与数据库中的平台名称完全一致（区分大小写）

---

## 接口 2：获取分类树

### 接口地址

```
GET http://8.147.104.190:8001/api/agent/search/category/{stable_id}
```

### 功能说明

获取指定分类的完整路径和子树结构，用于导航和展示分类层级关系。

### 请求参数

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| stable_id | integer | ✓ | - | 分类的 stable_id（路径参数） |
| source_type | string | ✓ | - | 元素类型：`实质` / `形式` / `意图` |
| include_ancestors | boolean | ✗ | true | 是否返回祖先路径（从根节点到当前节点） |
| descendant_depth | integer | ✗ | -1 | 返回子孙深度，-1=全部，0=仅当前节点，1=子节点，2=子+孙... |

### 返回格式

```json
{
  "success": true,
  "current": {
    "stable_id": 125,
    "name": "吉祥用语",
    "description": "通用的吉祥话语和祝福词句",
    "path": "/表象/符号/表达符号/祝福语/吉祥用语",
    "level": 5
  },
  "ancestors": [
    {
      "stable_id": 38,
      "name": "表象",
      "path": "/表象",
      "level": 1
    },
    {
      "stable_id": 40,
      "name": "符号",
      "path": "/表象/符号",
      "level": 2
    }
  ],
  "descendants": [
    {
      "stable_id": 126,
      "name": "新年祝福",
      "description": "新年相关的祝福语",
      "path": "/表象/符号/表达符号/祝福语/吉祥用语/新年祝福",
      "level": 6,
      "children": []
    }
  ]
}
```

### 使用示例

#### 获取分类的完整路径和所有子孙
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/category/125" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "include_ancestors=true" \
  --data-urlencode "descendant_depth=-1"
```

#### 只获取当前节点和祖先路径
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/category/125" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "include_ancestors=true" \
  --data-urlencode "descendant_depth=0"
```

#### 获取2代子孙节点
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/category/125" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "descendant_depth=2"
```

---

## 接口 3：获取全量元素数据

### 接口地址

```
GET http://8.147.104.190:8001/api/agent/search/elements
```

### 功能说明

获取全量元素数据，支持分页、排序、筛选。主要用于获取高频元素、按分类浏览元素等场景。

### 请求参数

| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| source_type | string | ✓ | - | 元素类型：`实质` / `形式` / `意图` |
| execution_id | integer | ✗ | null | 按执行 ID 筛选（可选） |
| page | integer | ✗ | 1 | 页码（从1开始） |
| page_size | integer | ✗ | 50 | 每页数量（1-200） |
| sort_by | string | ✗ | name | 排序字段：`name` / `id` / `occurrence_count` |
| order | string | ✗ | asc | 排序方向：`asc` / `desc` |
| category_path | string | ✗ | null | 按分类路径前缀筛选（可选） |
| platform | string | ✗ | null | 按平台筛选（可选） |
| min_occurrence | integer | ✗ | null | 最小出现次数（可选） |

### 返回格式

```json
{
  "success": true,
  "source_type": "实质",
  "page": 1,
  "page_size": 50,
  "total": 4082,
  "total_pages": 82,
  "results": [
    {
      "id": 45,
      "name": "祝福语",
      "description": "'吉祥如意'、'幸福安康'等文字内容",
      "occurrence_count": 974,
      "element_sub_type": "具象概念",
      "category": {
        "stable_id": 125,
        "name": "吉祥用语",
        "path": "/表象/符号/表达符号/祝福语/吉祥用语"
      }
    }
  ]
}
```

### 使用示例

#### 获取高频元素前50（默认）
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质"
```

#### 获取高频元素前10
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "page=1" \
  --data-urlencode "page_size=10" \
  --data-urlencode "sort_by=occurrence_count" \
  --data-urlencode "order=desc"
```

#### 按名称排序
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "sort_by=name" \
  --data-urlencode "order=asc"
```

#### 筛选指定分类下的元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "category_stable_id=125"
```

#### 筛选出现次数>=10的元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "min_occurrence=10"
```

#### 按平台筛选元素
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=形式" \
  --data-urlencode "platform=小红书"
```

#### 组合筛选：指定分类+最小出现次数
```bash
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "category_stable_id=125" \
  --data-urlencode "min_occurrence=50" \
  --data-urlencode "page_size=20"
```

#### 分页浏览
```bash
# 第1页
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "page=1" \
  --data-urlencode "page_size=50"

# 第2页
curl -G "http://8.147.104.190:8001/api/agent/search/elements" \
  --data-urlencode "source_type=实质" \
  --data-urlencode "page=2" \
  --data-urlencode "page_size=50"
```

---

