乐于分享
好东西不私藏

用 Go 实现一个文档索引器:读取 → 分块 → Embedding → 存储

用 Go 实现一个文档索引器:读取 → 分块 → Embedding → 存储

🦞 一只用 AI Agent 搭副业产线的程序员


前三篇我们分别讲了 RAG 原理、分块策略、向量数据库。是时候把它们焊在一起了。

这篇的目标:一个命令,把一文件夹 Markdown 文档变成可搜索的知识库。 完整 Go 代码,可编译运行。


索引器要做什么

你的 Markdown 文件夹/
├── redis-cache.md
├── mysql-optimization.md
└── k8s-deploy.md
         │
         ▼
   [文档索引器]   ← 这篇我们要写的
         │
         ▼
   Qdrant 向量数据库
   ├── [向量1] → "Redis 缓存淘汰策略包括..."
   ├── [向量2] → "MySQL 索引优化首先需要..."
   ├── [向量3] → "Kubernetes 中 Deployment..."
   └── ...共 500 个文档片段

四步流水线:读取文件 → 分块 → 调 Embedding API → 写入 Qdrant。


第一步:项目结构

doc-indexer/
├── main.go
├── go.mod
├── internal/
│   ├── reader/       # 读取 Markdown 文件
│   │   └── reader.go
│   ├── chunker/      # 文档分块(上一篇的代码)
│   │   └── chunker.go
│   ├── embedder/     # Embedding API 调用
│   │   └── embedder.go
│   └── store/        # Qdrant 写入
│       └── qdrant.go

第二步:读取 Markdown 文件

// internal/reader/reader.go
package reader

import (
"os"
"path/filepath"
"strings"
)

type Document struct {
    Name    string// 文件名(去路径去后缀)
    Path    string// 完整路径
    Content string// 完整内容
}

// ReadDir 读取目录下所有 .md 文件
funcReadDir(dir string)([]Document, error) {
var docs []Document

    err := filepath.Walk(dir, func(path string, info os.FileInfo, err error)error {
if err != nil {
return err
        }
if info.IsDir() || !strings.HasSuffix(path, ".md") {
returnnil
        }
        content, err := os.ReadFile(path)
if err != nil {
return err
        }
        name := strings.TrimSuffix(info.Name(), ".md")
        docs = append(docs, Document{
            Name:    name,
            Path:    path,
            Content: string(content),
        })
returnnil
    })
return docs, err
}

filepath.Walk 递归读取所有子目录里的 .md 文件。一个函数搞定。


第三步:分块(复用上篇的 Chunker)

// internal/chunker/chunker.go
package chunker

import"strings"

type Chunker struct {
    ChunkSize int
    Overlap   int
}

funcNewChunker(size, overlap int) *Chunker {
return &Chunker{ChunkSize: size, Overlap: overlap}
}

// Chunk 递归切分 Markdown 文本
func(c *Chunker)Chunk(text string) []string {
// 先按 ## 标题切
    sections := strings.Split(text, "\n## ")
var chunks []string

for _, section := range sections {
        runes := []rune(section)
iflen(runes) <= c.ChunkSize {
iflen(strings.TrimSpace(section)) > 0 {
                chunks = append(chunks, section)
            }
continue
        }
// 太长,按空行再切
        paragraphs := strings.Split(section, "\n\n")
for _, para := range paragraphs {
            paraRunes := []rune(para)
iflen(paraRunes) <= c.ChunkSize {
iflen(strings.TrimSpace(para)) > 0 {
                    chunks = append(chunks, para)
                }
continue
            }
// 还是太长,硬截断
for i := 0; i < len(paraRunes); i += c.ChunkSize {
                end := i + c.ChunkSize
if end > len(paraRunes) {
                    end = len(paraRunes)
                }
                chunk := string(paraRunes[i:end])
iflen(strings.TrimSpace(chunk)) > 0 {
                    chunks = append(chunks, chunk)
                }
            }
        }
    }
return chunks
}

第四步:调 Embedding API

// internal/embedder/embedder.go
package embedder

import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)

type Embedder struct {
    apiKey     string
    baseURL    string
    model      string
    httpClient *http.Client
}

funcNewEmbedder(apiKey string) *Embedder {
return &Embedder{
        apiKey:  apiKey,
        baseURL: "https://api.deepseek.com/anthropic",
        model:   "deepseek-v4-pro",
        httpClient: &http.Client{
            Timeout: 30 * time.Second,
        },
    }
}

// Embed 将文本转为向量
func(e *Embedder)Embed(text string)([]float64, error) {
    reqBody := map[string]any{
"model": e.model,
"input": text,
    }
    body, _ := json.Marshal(reqBody)

    req, err := http.NewRequest("POST",
        e.baseURL+"/v1/embeddings", bytes.NewReader(body))
if err != nil {
returnnil, err
    }
    req.Header.Set("x-api-key", e.apiKey)
    req.Header.Set("Content-Type""application/json")

    resp, err := e.httpClient.Do(req)
if err != nil {
returnnil, fmt.Errorf("embedding 请求失败: %w", err)
    }
defer resp.Body.Close()

var result struct {
        Data []struct {
            Embedding []float64`json:"embedding"`
        } `json:"data"`
    }
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
returnnil, fmt.Errorf("解析响应失败: %w", err)
    }
iflen(result.Data) == 0 {
returnnil, fmt.Errorf("embedding 返回为空")
    }
return result.Data[0].Embedding, nil
}

// EmbedBatch 批量转向量(一次 API 调用处理多条,省钱)
func(e *Embedder)EmbedBatch(texts []string)([][]float64, error) {
    inputs := make([]stringlen(texts))
copy(inputs, texts)

    reqBody := map[string]any{
"model": e.model,
"input": inputs,
    }
    body, _ := json.Marshal(reqBody)

    req, _ := http.NewRequest("POST",
        e.baseURL+"/v1/embeddings", bytes.NewReader(body))
    req.Header.Set("x-api-key", e.apiKey)
    req.Header.Set("Content-Type""application/json")

    resp, err := e.httpClient.Do(req)
if err != nil {
returnnil, err
    }
defer resp.Body.Close()

var result struct {
        Data []struct {
            Embedding []float64`json:"embedding"`
        } `json:"data"`
    }
    json.NewDecoder(resp.Body).Decode(&result)

var embeddings [][]float64
for _, d := range result.Data {
        embeddings = append(embeddings, d.Embedding)
    }
return embeddings, nil
}

注意 EmbedBatch——一次 API 调用传入多个文本,比单独调用 N 次省时间和 Token。


第五步:写入 Qdrant

// internal/store/qdrant.go
package store

import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)

type QdrantStore struct {
    baseURL    string
    collection string
    httpClient *http.Client
}

type Point struct {
    ID      uint64`json:"id"`
    Vector  []float64`json:"vector"`
    Payload map[string]any `json:"payload"`
}

funcNewQdrantStore(url, collection string) *QdrantStore {
return &QdrantStore{
        baseURL:    url,
        collection: collection,
        httpClient: &http.Client{},
    }
}

// EnsureCollection 如果集合不存在则创建
func(s *QdrantStore)EnsureCollection(
    vectorSize int,
)
error
 {
    checkURL := fmt.Sprintf("%s/collections/%s",
        s.baseURL, s.collection)
    resp, _ := s.httpClient.Get(checkURL)

if resp.StatusCode == 200 {
returnnil// 已存在
    }

    reqBody := map[string]any{
"name": s.collection,
"vectors"map[string]any{
"size":     vectorSize,
"distance""Cosine",
        },
    }
    body, _ := json.Marshal(reqBody)
    req, _ := http.NewRequest("PUT",
        s.baseURL+"/collections/"+s.collection,
        bytes.NewReader(body))
    req.Header.Set("Content-Type""application/json")

    resp, err := s.httpClient.Do(req)
if err != nil {
return fmt.Errorf("创建集合失败: %w", err)
    }
if resp.StatusCode != 200 {
return fmt.Errorf("创建集合返回 %d", resp.StatusCode)
    }
returnnil
}

// Upsert 批量插入向量
func(s *QdrantStore)Upsert(points []Point)error {
    reqBody := map[string]any{
"points": points,
    }
    body, _ := json.Marshal(reqBody)

    url := fmt.Sprintf("%s/collections/%s/points",
        s.baseURL, s.collection)
    req, _ := http.NewRequest("PUT", url, bytes.NewReader(body))
    req.Header.Set("Content-Type""application/json")

    resp, err := s.httpClient.Do(req)
if err != nil {
return fmt.Errorf("upsert 失败: %w", err)
    }
defer resp.Body.Close()

if resp.StatusCode != 200 {
return fmt.Errorf("upsert 返回 %d", resp.StatusCode)
    }
returnnil
}

组装:主流程

// main.go
package main

import (
"fmt"
"log"
"os"

"doc-indexer/internal/chunker"
"doc-indexer/internal/embedder"
"doc-indexer/internal/reader"
"doc-indexer/internal/store"
)

funcmain() {
    apiKey := os.Getenv("DEEPSEEK_API_KEY")
if apiKey == "" {
        log.Fatal("请设置环境变量 DEEPSEEK_API_KEY")
    }

// 读取目录下所有 Markdown 文档
    docs, err := reader.ReadDir("./docs")
if err != nil {
        log.Fatalf("读取文档失败: %v", err)
    }
    fmt.Printf("读取到 %d 个 Markdown 文件\n"len(docs))

    c := chunker.NewChunker(40050)
    emb := embedder.NewEmbedder(apiKey)
    qdrant := store.NewQdrantStore(
"http://localhost:6333""tech_docs")

// 确保集合存在(1536 维向量)
if err := qdrant.EnsureCollection(1536); err != nil {
        log.Fatalf("创建集合失败: %v", err)
    }

var totalChunks int
for _, doc := range docs {
        chunks := c.Chunk(doc.Content)
        fmt.Printf("  %s → %d 个片段\n", doc.Name, len(chunks))

// 批量生成 Embedding(每批最多 20 条)
for i := 0; i < len(chunks); i += 20 {
            end := i + 20
if end > len(chunks) {
                end = len(chunks)
            }
            batch := chunks[i:end]

            embeddings, err := emb.EmbedBatch(batch)
if err != nil {
                log.Printf("Embedding 失败: %v", err)
continue
            }

// 构造 Qdrant points
var points []store.Point
for j, embedding := range embeddings {
                points = append(points, store.Point{
                    ID:     uint64(totalChunks + 1),
                    Vector: embedding,
                    Payload: map[string]any{
"text":     batch[j],
"doc_name": doc.Name,
"chunk":    i + j + 1,
                    },
                })
                totalChunks++
            }

if err := qdrant.Upsert(points); err != nil {
                log.Printf("写入 Qdrant 失败: %v", err)
            }
        }
    }

    fmt.Printf("\n✅ 索引完成!共 %d 个文档片段已写入 Qdrant\n",
        totalChunks)
}

跑起来

# 1. 启动 Qdrant(如果没有)
docker run -d -p 6333:6333 -p 6334:6334 qdrant/qdrant

# 2. 准备文档
mkdir -p docs
cp /your/project/docs/*.md docs/

# 3. 设置 API Key
export DEEPSEEK_API_KEY="sk-your-key"

# 4. 索引
go run main.go

# 输出:
# 读取到 12 个 Markdown 文件
#   redis-cache → 8 个片段
#   mysql-optimization → 12 个片段
#   ...
# ✅ 索引完成!共 87 个文档片段已写入 Qdrant

打开浏览器访问 http://localhost:6333/dashboard,你能在 Qdrant 的 Web UI 里看到每个向量的内容和 payload。


我踩过的坑

  1. 批量调用比逐个快 5 倍。Embedding API 支持一次传多个文本,返回多个向量。如果不看文档,一个一个调,10 个文档能跑 5 分钟。
  2. Qdrant 的集合要先创建。不像 MongoDB 自动建库。不创建就写会报 404。
  3. 中文文档的编码:Go 的 os.ReadFile 默认 UTF-8,但有些 Windows 导出的 Markdown 是 GBK。如果发现乱码,加一个编码检测。

本篇核心收获

100 行 Go 代码,把任意一文件夹 Markdown 文档变成了可语义搜索的知识库。你现在拥有的是一个 RAG 系统的「写链路」——文档进来,向量出去。

下一篇我们做「读链路」:语义搜索。当用户提问时,查询重写 + 结果排序,让命中率再提一个档次。

关注我,别错过。


🦞 一只用 AI Agent 搭副业产线的程序员

全平台同名:虾哥不加班 需要定制 AI 工具?来聊聊 → lob_ai

源码:GitHub - lobster-bujiaban/doc-indexer

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-31 16:42:25 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/689931.html
  2. 运行时间 : 0.091297s [ 吞吐率:10.95req/s ] 内存消耗:4,688.88kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5ec3fb5561633a13a1ee75e674074a2e
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000518s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000683s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000275s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000276s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000616s ]
  6. SELECT * FROM `set` [ RunTime:0.000231s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000654s ]
  8. SELECT * FROM `article` WHERE `id` = 689931 LIMIT 1 [ RunTime:0.000890s ]
  9. UPDATE `article` SET `lasttime` = 1780216945 WHERE `id` = 689931 [ RunTime:0.000948s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000287s ]
  11. SELECT * FROM `article` WHERE `id` < 689931 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000495s ]
  12. SELECT * FROM `article` WHERE `id` > 689931 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000428s ]
  13. SELECT * FROM `article` WHERE `id` < 689931 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001052s ]
  14. SELECT * FROM `article` WHERE `id` < 689931 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002892s ]
  15. SELECT * FROM `article` WHERE `id` < 689931 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002094s ]
0.093089s