# Zenfeed Query API 使用教程

Zenfeed Query API 允许用户通过多种条件检索存储的 Feed 数据。本教程将详细介绍如何使用此 API。

## 接口说明

### 请求

*   **方法**: `POST`
*   **URL**: `/query`
*   **Content-Type**: `application/json`

### 请求体 (JSON)

```json
{
  "query": "string",
  "threshold": 0.55,
  "label_filters": ["string"],
  "summarize": false,
  "limit": 10,
  "start": "2006-01-02T15:04:05Z07:00",
  "end": "2006-01-02T15:04:05Z07:00"
}
```

**字段说明:**

*   `query` (string, 可选):
    *   用于语义搜索的查询字符串。
    *   如果提供，必须至少包含 5 个字符。
    *   如果为空或未提供，则不进行语义搜索，仅根据其他条件（如标签、时间）过滤。
*   `threshold` (float32, 可选, 默认值: `0.55`):
    *   语义搜索的相关性阈值。
    *   取值范围: `[0, 1]`。
    *   仅当 `query` 字段非空时有效。
*   `label_filters` ([]string, 可选):
    *   一个字符串数组，用于根据 Feed 的标签进行过滤。
    *   每个过滤器的格式为:
        *   `"key=value"`: 匹配标签 `key` 的值为 `value` 的 Feed。
        *   `"key!=value"`: 匹配标签 `key` 的值不为 `value` 的 Feed。
    *   常用的 `key` 包括:
        *   `source`: Feed 来源
        *   `title`: Feed 标题
        *   `你在 rewrite 阶段自定义创建的`：比如 category
    *   可以指定多个过滤器，它们之间是 "AND" 关系。
*   `summarize` (bool, 可选, 默认值: `false`):
    *   是否对查询结果进行摘要。
    *   如果为 `true`，系统将调用配置的 LLM (Large Language Model) 对返回的 Feed 内容进行总结。
*   `limit` (int, 可选, 默认值: `10`):
    *   返回 Feed 结果的最大数量。
    *   取值范围: `[1, 500]`。
*   `start` (string, 可选, 默认值: 24小时前):
    *   查询的时间范围的开始时间（包含）。
    *   格式为 RFC3339 (例如: `"2023-10-26T10:00:00Z"`)。
*   `end` (string, 可选, 默认值: 当前时间):
    *   查询的时间范围的结束时间（不包含）。
    *   格式为 RFC3339 (例如: `"2023-10-27T10:00:00Z"`)。
    *   `end` 时间必须晚于 `start` 时间。

### 响应体 (JSON)

```json
{
  "summary": "string",
  "feeds": [
    {
      "labels": {
        "type": "rss",
        "source": "Example News",
        "title": "Breaking News: AI Revolutionizes Everything",
        "link": "http://example.com/news/123",
        "pub_time": "2023-10-26T09:30:00Z",
        "content": "Detailed content of the news article..."
      },
      "time": "2023-10-26T10:15:30+08:00",
      "score": 0.85
    }
  ],
  "count": 1
}
```

**字段说明:**

*   `summary` (string, 可选):
    *   如果请求中的 `summarize` 为 `true` 且成功生成摘要，此字段将包含 LLM 生成的内容摘要。
    *   如果生成摘要失败，可能包含错误信息。
*   `feeds` ([]object, 必须):
    *   一个对象数组，每个对象代表一个符合查询条件的 Feed。
    *   **Feed 对象结构**:
        *   `labels` (object): Feed 的元数据标签，键值对形式。
            *   `type` (string): Feed 类型。
            *   `source` (string): Feed 来源。
            *   `title` (string): Feed 标题。
            *   `link` (string): Feed 原始链接。
            *   `pub_time` (string): Feed 发布时间。
            *   `content` (string): Feed 内容。
            *   ... (其他自定义标签)
        *   `time` (string): Feed 被系统记录或处理的时间戳 (RFC3339 格式，通常为服务器本地时区)。
        *   `score` (float32, 可选):
            *   当请求中提供了 `query` (进行了语义搜索) 时，此字段表示该 Feed 与查询的相关性得分。
            *   得分越高，相关性越强。
*   `count` (int, 必须):
    *   返回的 `feeds` 数组中的 Feed 数量。

## `curl` 示例

以下示例假设 Zenfeed 服务运行在 `http://localhost:1300`。

### 1. 基本查询 (获取最近10条记录)

获取最近（默认24小时内）的最多10条 Feed。

```bash
curl -X POST http://localhost:1300/query \
-H "Content-Type: application/json" \
-d '{}'
```

### 2. 语义搜索

查询与 "人工智能最新进展" 相关的 Feed，并设置相关性阈值为 `0.7`。

```bash
curl -X POST http://localhost:1300/query \
-H "Content-Type: application/json" \
-d '{
  "query": "人工智能最新进展",
  "threshold": 0.7
}'
```

### 3. 带标签过滤的查询

查询类型为 "rss" 且来源不是 "SpecificSource" 的 Feed。

```bash
curl -X POST http://localhost:1300/query \
-H "Content-Type: application/json" \
-d '{
  "label_filters": [
    "type=rss",
    "source!=SpecificSource"
  ]
}'
```

### 4. 带时间范围的查询

查询 2023年10月25日 00:00:00 UTC 到 2023年10月26日 00:00:00 UTC 之间的 Feed。

```bash
curl -X POST http://localhost:1300/query \
-H "Content-Type: application/json" \
-d '{
  "start": "2023-10-25T00:00:00Z",
  "end": "2023-10-26T00:00:00Z"
}'
```

### 5. 组合查询示例

查询过去3天内，与 "开源项目" 相关的 Feed，类型为 "github_release"，并获取摘要，最多返回20条。

```bash
# 假设今天是 2023-10-28
curl -X POST http://localhost:1300/query \
-H "Content-Type: application/json" \
-d '{
  "query": "最近的热门开源项目", # 尽可能详细，获得最佳搜索效果
  "threshold": 0.6,
  "label_filters": ["source=github_trending"],
  "summarize": true,
  "limit": 20,
  "start": "2023-10-25T00:00:00Z", # 手动计算或动态生成
  "end": "2023-10-28T00:00:00Z"   # 手动计算或动态生成
}'
```
