@fgbg/mdocs 1.3.17 → 1.3.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +1 -1
  2. package/agent-skills/changelog/SKILL.md +14 -0
  3. package/agent-skills/index.json +1 -1
  4. package/agent-skills/usage-search/SKILL.md +14 -11
  5. package/dist/server/agent/Agent/tool-ui-effects.js +7 -1
  6. package/dist/server/agent/Agent/tool-ui-effects.js.map +1 -1
  7. package/dist/server/db/schema.js +30 -0
  8. package/dist/server/db/schema.js.map +1 -1
  9. package/dist/server/search/document-index-manager.js +33 -40
  10. package/dist/server/search/document-index-manager.js.map +1 -1
  11. package/dist/server/search/document-index-manager.test.js +194 -14
  12. package/dist/server/search/document-index-manager.test.js.map +1 -1
  13. package/dist/server/search/search.service.js +150 -42
  14. package/dist/server/search/search.service.js.map +1 -1
  15. package/dist/web/assets/{AgentChatPanel-C3c14Bo_.js → AgentChatPanel-DTj8Nz0Z.js} +2 -2
  16. package/dist/web/assets/{AgentSkillFormCard-BYUjSFe1.js → AgentSkillFormCard-DTgxybJh.js} +3 -3
  17. package/dist/web/assets/{AiWriteWorkbench-ze827qk7.js → AiWriteWorkbench-D2RzXzty.js} +3 -3
  18. package/dist/web/assets/{DiagramEditor-NtNY3sZL-Cie6NhLx.js → DiagramEditor-NtNY3sZL-B2Aeu79R.js} +1 -1
  19. package/dist/web/assets/{DocChrome-ixaNyUG9.js → DocChrome-4qmjr6wa.js} +1 -1
  20. package/dist/web/assets/{DocumentEditor-ByqPHijF.js → DocumentEditor-KEURMFDp.js} +1 -1
  21. package/dist/web/assets/{HtmlEditor-CpqCAPAr.js → HtmlEditor-jCKtKOCT.js} +1 -1
  22. package/dist/web/assets/{MergeView-D93ZHlTG.js → MergeView-eRcs-x1s.js} +2 -2
  23. package/dist/web/assets/{PlaygroundPage-CodSaeWS.js → PlaygroundPage-M7fqYn4Z.js} +1 -1
  24. package/dist/web/assets/SettingsPage-mS3g_vBq.js +1 -0
  25. package/dist/web/assets/{Toolbar-CSKpV4ua.js → Toolbar-F3tR5o7R.js} +1 -1
  26. package/dist/web/assets/{VisitorPickerModal-CqDA1S9F.js → VisitorPickerModal-CPjKg8ox.js} +1 -1
  27. package/dist/web/assets/{check-CN9m0reb.js → check-CQSGOkW1.js} +1 -1
  28. package/dist/web/assets/{copy-DFs3qk19.js → copy-BMAJ--_Y.js} +1 -1
  29. package/dist/web/assets/index-C8iEyMxp.css +1 -0
  30. package/dist/web/assets/{index-CUdIA5aE.js → index-DUu4Is5p.js} +50 -45
  31. package/dist/web/assets/{meta2dEngine-BD2XbzaV-SYn2XtSh.js → meta2dEngine-BD2XbzaV-BAZUiXoN.js} +1 -1
  32. package/dist/web/assets/{plus-QDhBbIRF.js → plus-C3uXIATM.js} +1 -1
  33. package/dist/web/assets/{react-Bf45libg.js → react-BXGUMaBS.js} +3 -3
  34. package/dist/web/index.html +2 -2
  35. package/package.json +1 -1
  36. package/dist/web/assets/SettingsPage-C8doYEbb.js +0 -6
  37. package/dist/web/assets/index-C0ujN3sT.css +0 -1
@@ -1,22 +1,34 @@
1
1
  import { describe, it, expect, beforeAll, afterEach, vi } from "vitest";
2
2
  import Database from "better-sqlite3";
3
+ import { Jieba } from "@node-rs/jieba";
4
+ import { dict } from "@node-rs/jieba/dict.js";
3
5
  import { applySchema } from "../db/schema.js";
4
6
  import { createDocument } from "../documents/document.service.js";
5
- import { rebuildAllDirty } from "./document-index-manager.js";
7
+ import { Permission } from "../access/access-control.js";
8
+ import { rebuildAllDirty, removeIndex, rebuildDocument } from "./document-index-manager.js";
6
9
  import { searchDocuments } from "./search.service.js";
7
10
  const testDbRef = vi.hoisted(() => ({ db: null }));
11
+ const contentByPath = vi.hoisted(() => new Map());
12
+ const JIEBA = Jieba.withDict(dict);
13
+ function tok(text) {
14
+ return JIEBA.cutForSearch(text, true).join(" ");
15
+ }
16
+ function lexical(text) {
17
+ return JSON.stringify({
18
+ root: {
19
+ children: [{ children: [{ type: "text", text }] }],
20
+ },
21
+ });
22
+ }
8
23
  vi.mock("../db/connection.js", () => ({
9
24
  getDb: () => testDbRef.db,
10
25
  }));
11
26
  vi.mock("../storage/file-store.js", () => ({
12
27
  writeDocument: () => ({ contentHash: "mock-hash", bytes: 0 }),
13
- readDocument: () => ({ content: JSON.stringify({
14
- root: {
15
- children: [{
16
- children: [{ type: "text", text: "测试文档内容" }]
17
- }]
18
- }
19
- }), contentHash: "mock-hash" }),
28
+ readDocument: (_domainId, relativePath) => ({
29
+ content: contentByPath.get(relativePath) ?? lexical("测试文档内容"),
30
+ contentHash: "mock-hash",
31
+ }),
20
32
  writeCommitBlob: () => ({ blobRef: "ab/mock", bytes: 0 }),
21
33
  readCommitBlob: () => "",
22
34
  deleteDocumentFile: () => { },
@@ -50,6 +62,28 @@ vi.mock("../logger/logger.js", () => ({
50
62
  error: () => { },
51
63
  }),
52
64
  }));
65
+ function insertFtsDoc(opts) {
66
+ const db = testDbRef.db;
67
+ const now = new Date().toISOString();
68
+ db.prepare(`INSERT INTO documents (
69
+ document_id, domain_id, relative_path, display_name, owner_visitor_id,
70
+ created_by, updated_by, content_hash, created_at, updated_at, permission, file_type, is_dirty
71
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'md', 0)`).run(opts.documentId, opts.domainId, opts.relativePath, opts.displayName, opts.ownerVisitorId, opts.ownerVisitorId, opts.ownerVisitorId, "hash", now, now, opts.permission);
72
+ if (opts.title !== undefined) {
73
+ const r = db
74
+ .prepare(`INSERT INTO documents_fts_title(title, document_id, display_name, relative_path, domain_id, owner_visitor_id, permission)
75
+ VALUES(?, ?, ?, ?, ?, ?, ?)`)
76
+ .run(tok(opts.title), opts.documentId, opts.displayName, opts.relativePath, opts.domainId, opts.ownerVisitorId, opts.permission);
77
+ db.prepare(`INSERT INTO documents_fts_title_rowid(document_id, fts_rowid) VALUES(?, ?)`).run(opts.documentId, r.lastInsertRowid);
78
+ }
79
+ if (opts.body !== undefined) {
80
+ const r = db
81
+ .prepare(`INSERT INTO documents_fts(content, document_id, display_name, relative_path, domain_id, owner_visitor_id, permission)
82
+ VALUES(?, ?, ?, ?, ?, ?, ?)`)
83
+ .run(tok(opts.body), opts.documentId, opts.displayName, opts.relativePath, opts.domainId, opts.ownerVisitorId, opts.permission);
84
+ db.prepare(`INSERT INTO documents_fts_rowid(document_id, fts_rowid) VALUES(?, ?)`).run(opts.documentId, r.lastInsertRowid);
85
+ }
86
+ }
53
87
  describe("Search functionality", () => {
54
88
  beforeAll(() => {
55
89
  const db = new Database(":memory:");
@@ -61,11 +95,13 @@ describe("Search functionality", () => {
61
95
  db.exec("DELETE FROM documents");
62
96
  db.exec("DELETE FROM documents_fts");
63
97
  db.exec("DELETE FROM documents_fts_rowid");
98
+ db.exec("DELETE FROM documents_fts_title");
99
+ db.exec("DELETE FROM documents_fts_title_rowid");
64
100
  db.exec("DELETE FROM audit_logs");
65
101
  db.exec("DELETE FROM document_invites");
102
+ contentByPath.clear();
66
103
  });
67
104
  it("should index documents and search works", async () => {
68
- // 创建测试文档
69
105
  createDocument({
70
106
  actorVisitorId: "test-actor",
71
107
  fileName: "test-document.md",
@@ -74,9 +110,7 @@ describe("Search functionality", () => {
74
110
  domainId: "default",
75
111
  parentId: null,
76
112
  });
77
- // 强制索引构建
78
113
  await rebuildAllDirty();
79
- // 搜索文档
80
114
  const results = searchDocuments({
81
115
  query: "测试",
82
116
  visitorId: "test-actor",
@@ -92,7 +126,6 @@ describe("Search functionality", () => {
92
126
  ]);
93
127
  });
94
128
  it("should not find documents with no matching terms", async () => {
95
- // 创建测试文档
96
129
  createDocument({
97
130
  actorVisitorId: "test-actor",
98
131
  fileName: "another-test.md",
@@ -101,9 +134,7 @@ describe("Search functionality", () => {
101
134
  domainId: "default",
102
135
  parentId: null,
103
136
  });
104
- // 强制索引构建
105
137
  await rebuildAllDirty();
106
- // 搜索不存在的术语
107
138
  const results = searchDocuments({
108
139
  query: "不存在的术语",
109
140
  visitorId: "test-actor",
@@ -112,5 +143,154 @@ describe("Search functionality", () => {
112
143
  });
113
144
  expect(results).toEqual([]);
114
145
  });
146
+ it("title-only hit ranks and returns displayName snippet", () => {
147
+ insertFtsDoc({
148
+ documentId: "title-only",
149
+ domainId: "default",
150
+ displayName: "恢复码说明",
151
+ relativePath: "recovery.md",
152
+ ownerVisitorId: "owner-a",
153
+ permission: Permission.PUBLIC_READ,
154
+ title: "恢复码说明",
155
+ body: "完全无关的正文内容",
156
+ });
157
+ const results = searchDocuments({
158
+ query: "恢复码",
159
+ visitorId: "anyone",
160
+ domainId: "default",
161
+ });
162
+ expect(results).toHaveLength(1);
163
+ expect(results[0].documentId).toBe("title-only");
164
+ expect(results[0].snippet).toBe("恢复码说明");
165
+ });
166
+ it("body-only hit still works", () => {
167
+ insertFtsDoc({
168
+ documentId: "body-only",
169
+ domainId: "default",
170
+ displayName: "普通标题",
171
+ relativePath: "body.md",
172
+ ownerVisitorId: "owner-a",
173
+ permission: Permission.PUBLIC_READ,
174
+ title: "普通标题",
175
+ body: "文中提到了向量检索算法",
176
+ });
177
+ const results = searchDocuments({
178
+ query: "向量检索",
179
+ visitorId: "anyone",
180
+ domainId: "default",
181
+ });
182
+ expect(results.map((r) => r.documentId)).toEqual(["body-only"]);
183
+ });
184
+ it("title strong hit ranks above body weak hit", () => {
185
+ insertFtsDoc({
186
+ documentId: "by-title",
187
+ domainId: "default",
188
+ displayName: "恢复码",
189
+ relativePath: "t.md",
190
+ ownerVisitorId: "owner-a",
191
+ permission: Permission.PUBLIC_READ,
192
+ title: "恢复码",
193
+ body: "无关正文 aaa bbb ccc",
194
+ });
195
+ insertFtsDoc({
196
+ documentId: "by-body",
197
+ domainId: "default",
198
+ displayName: "别的文档",
199
+ relativePath: "b.md",
200
+ ownerVisitorId: "owner-a",
201
+ permission: Permission.PUBLIC_READ,
202
+ title: "别的文档",
203
+ body: "这里偶尔提到恢复码一次而已",
204
+ });
205
+ const results = searchDocuments({
206
+ query: "恢复码",
207
+ visitorId: "anyone",
208
+ domainId: "default",
209
+ });
210
+ expect(results.map((r) => r.documentId)).toEqual(["by-title", "by-body"]);
211
+ expect(results[0].bm25Score).toBeGreaterThan(results[1].bm25Score);
212
+ });
213
+ it("domainId filters both title and body paths", () => {
214
+ insertFtsDoc({
215
+ documentId: "in-a",
216
+ domainId: "default",
217
+ displayName: "共享词",
218
+ relativePath: "a.md",
219
+ ownerVisitorId: "owner-a",
220
+ permission: Permission.PUBLIC_READ,
221
+ title: "共享词",
222
+ body: "共享词正文",
223
+ });
224
+ const now = new Date().toISOString();
225
+ testDbRef.db.prepare(`INSERT INTO domains (domain_id, domain_name, creator_visitor_id, created_at, updated_at, permission)
226
+ VALUES (?, ?, ?, ?, ?, ?)`).run("domain-b", "B", "system", now, now, "public");
227
+ insertFtsDoc({
228
+ documentId: "in-b",
229
+ domainId: "domain-b",
230
+ displayName: "共享词",
231
+ relativePath: "b.md",
232
+ ownerVisitorId: "owner-a",
233
+ permission: Permission.PUBLIC_READ,
234
+ title: "共享词",
235
+ body: "共享词正文",
236
+ });
237
+ const results = searchDocuments({
238
+ query: "共享词",
239
+ visitorId: "anyone",
240
+ domainId: "default",
241
+ });
242
+ expect(results.map((r) => r.documentId)).toEqual(["in-a"]);
243
+ });
244
+ it("private docs are filtered by canReadDocument", () => {
245
+ const now = new Date().toISOString();
246
+ testDbRef.db.prepare(`INSERT INTO domains (domain_id, domain_name, creator_visitor_id, created_at, updated_at, permission)
247
+ VALUES (?, ?, ?, ?, ?, ?)`).run("priv-domain", "Private", "owner-a", now, now, "private");
248
+ insertFtsDoc({
249
+ documentId: "secret",
250
+ domainId: "priv-domain",
251
+ displayName: "机密恢复码",
252
+ relativePath: "secret.md",
253
+ ownerVisitorId: "owner-a",
254
+ permission: Permission.PRIVATE,
255
+ title: "机密恢复码",
256
+ body: "机密正文",
257
+ });
258
+ expect(searchDocuments({ query: "恢复码", visitorId: "stranger", domainId: "priv-domain" })).toEqual([]);
259
+ expect(searchDocuments({ query: "恢复码", visitorId: "owner-a", domainId: "priv-domain" }).map((r) => r.documentId)).toEqual(["secret"]);
260
+ });
261
+ it("rename rebuild updates title index", async () => {
262
+ contentByPath.set("rename.md", lexical("无关正文"));
263
+ const created = createDocument({
264
+ actorVisitorId: "test-actor",
265
+ fileName: "rename.md",
266
+ displayName: "旧标题词",
267
+ content: "无关正文",
268
+ domainId: "default",
269
+ parentId: null,
270
+ });
271
+ await rebuildAllDirty();
272
+ expect(searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toHaveLength(1);
273
+ testDbRef.db.prepare(`UPDATE documents SET display_name = ?, is_dirty = 1, updated_at = ? WHERE document_id = ?`).run("新标题词", new Date().toISOString(), created.documentId);
274
+ rebuildDocument(created.documentId);
275
+ expect(searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toEqual([]);
276
+ expect(searchDocuments({ query: "新标题词", visitorId: "test-actor", domainId: "default" }).map((r) => r.documentId)).toEqual([created.documentId]);
277
+ });
278
+ it("removeIndex clears both fts paths", async () => {
279
+ contentByPath.set("gone.md", lexical("正文里有独有词xyzabc"));
280
+ const created = createDocument({
281
+ actorVisitorId: "test-actor",
282
+ fileName: "gone.md",
283
+ displayName: "独有标题词xyzabc",
284
+ content: "正文里有独有词xyzabc",
285
+ domainId: "default",
286
+ parentId: null,
287
+ });
288
+ await rebuildAllDirty();
289
+ // createDocument 会 nextTick 再 rebuild;先冲掉,避免 remove 后又被写回
290
+ await new Promise((resolve) => process.nextTick(resolve));
291
+ removeIndex(created.documentId);
292
+ testDbRef.db.prepare(`DELETE FROM documents WHERE document_id = ?`).run(created.documentId);
293
+ expect(searchDocuments({ query: "xyzabc", visitorId: "test-actor", domainId: "default" })).toEqual([]);
294
+ });
115
295
  });
116
296
  //# sourceMappingURL=document-index-manager.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-index-manager.test.js","sourceRoot":"","sources":["../../../src/server/search/document-index-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-index-manager.test.js","sourceRoot":"","sources":["../../../src/server/search/document-index-manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAgC,EAAE,CAAC,CAAC,CAAC;AAC/E,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAkB,CAAC,CAAC;AAElE,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACnC,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE;YACJ,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACnD;KACF,CAAC,CAAC;AACL,CAAC;AAED,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;IACzC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7D,YAAY,EAAE,CAAC,SAAiB,EAAE,YAAoB,EAAE,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC;QAC7D,WAAW,EAAE,WAAW;KACzB,CAAC;IACF,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACzD,cAAc,EAAE,GAAG,EAAE,CAAC,EAAE;IACxB,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;CAC7B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,iBAAiB;QAC1B,MAAM,EAAE,oCAAoC;QAC5C,QAAQ,EAAE,uBAAuB;QACjC,OAAO,EAAE,4BAA4B;QACrC,SAAS,EAAE,8BAA8B;QACzC,OAAO,EAAE,sBAAsB;QAC/B,UAAU,EAAE,qBAAqB;QACjC,OAAO,EAAE;YACP,KAAK,EAAE,QAAiB;YACxB,YAAY,EAAE,QAAiB;YAC/B,YAAY,EAAE,MAAe;YAC7B,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,IAAI;SACnB;QACD,eAAe,EAAE,SAAS;KAC3B,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAChB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;QACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,SAAS,YAAY,CAAC,IASrB;IACC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAG,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,EAAE,CAAC,OAAO,CACR;;;wDAGoD,CACrD,CAAC,GAAG,CACH,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,cAAc,EACnB,MAAM,EACN,GAAG,EACH,GAAG,EACH,IAAI,CAAC,UAAU,CAChB,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE;aACT,OAAO,CACN;qCAC6B,CAC9B;aACA,GAAG,CACF,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EACf,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,CAChB,CAAC;QACJ,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC,CAAC,GAAG,CAC1F,IAAI,CAAC,UAAU,EACf,CAAC,CAAC,eAAe,CAClB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,EAAE;aACT,OAAO,CACN;qCAC6B,CAC9B;aACA,GAAG,CACF,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EACd,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,CAChB,CAAC;QACJ,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC,GAAG,CACpF,IAAI,CAAC,UAAU,EACf,CAAC,CAAC,eAAe,CAClB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,SAAS,CAAC,EAAG,CAAC;QACzB,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACjC,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACrC,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC3C,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC3C,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACjD,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAClC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACxC,aAAa,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,cAAc,CAAC;YACb,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE,kBAAkB;YAC5B,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,oBAAoB;YAC7B,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,eAAe,EAAE,CAAC;QAExB,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC9B,WAAW,EAAE,MAAM;gBACnB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;aAC5B,CAAC;SACH,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,cAAc,CAAC;YACb,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE,iBAAiB;YAC3B,WAAW,EAAE,SAAS;YACtB,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,eAAe,EAAE,CAAC;QAExB,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,QAAQ;YACf,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,EAAE;SACT,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,YAAY,CAAC;YACX,UAAU,EAAE,YAAY;YACxB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,aAAa;YAC3B,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,WAAW;SAClB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,YAAY,CAAC;YACX,UAAU,EAAE,WAAW;YACvB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,SAAS;YACvB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,MAAM;YACb,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,YAAY,CAAC;YACX,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,MAAM;YACpB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC;QACH,YAAY,CAAC;YACX,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,MAAM;YACnB,YAAY,EAAE,MAAM;YACpB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,YAAY,CAAC;YACX,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,MAAM;YACpB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,EAAG,CAAC,OAAO,CACnB;iCAC2B,CAC5B,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAErD,YAAY,CAAC;YACX,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,MAAM;YACpB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,eAAe,CAAC;YAC9B,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,SAAS;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,SAAS,CAAC,EAAG,CAAC,OAAO,CACnB;iCAC2B,CAC5B,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;QAEhE,YAAY,CAAC;YACX,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,aAAa;YACvB,WAAW,EAAE,OAAO;YACpB,YAAY,EAAE,WAAW;YACzB,cAAc,EAAE,SAAS;YACzB,UAAU,EAAE,UAAU,CAAC,OAAO;YAC9B,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;QAEH,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAClF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEd,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,GAAG,CAClF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CACpB,CACF,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,MAAM;YACnB,OAAO,EAAE,MAAM;YACf,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,MAAM,eAAe,EAAE,CAAC;QACxB,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CACjF,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAElB,SAAS,CAAC,EAAG,CAAC,OAAO,CACnB,2FAA2F,CAC5F,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAE5D,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpC,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CACjF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAClF,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CACpB,CACF,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,cAAc,CAAC;YAC7B,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,eAAe;YACxB,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,eAAe,EAAE,CAAC;QACxB,0DAA0D;QAC1D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAEhE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChC,SAAS,CAAC,EAAG,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAE7F,MAAM,CACJ,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CACnF,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,35 +1,44 @@
1
+ import { Jieba } from "@node-rs/jieba";
2
+ import { dict } from "@node-rs/jieba/dict.js";
1
3
  import { getDb } from "../db/connection.js";
2
4
  import { findDomainById, isDomainMember } from "../db/repositories/domain.repo.js";
3
5
  import { canReadDocument } from "../access/access-control.js";
6
+ /** 与索引写入侧一致:查询也先 jieba,再交给 FTS5 */
7
+ const JIEBA = Jieba.withDict(dict);
8
+ /** 标题命中权重(相对正文) */
9
+ const W_TITLE = 3.0;
10
+ /** 正文命中权重 */
11
+ const W_BODY = 1.0;
4
12
  /**
5
13
  * 在全文索引中搜索文档。
6
14
  *
7
15
  * 流程:
8
- * 1. 在 documents_fts 中执行 MATCH 查询,按 BM25 排名
9
- * 2. 按 domainId 过滤(若传入)
10
- * 3. 对每个匹配文档执行 canReadDocument 权限检查
11
- * 4. 截取 topN 条结果
16
+ * 1. 标题索引 MATCH → 正文索引 MATCH
17
+ * 2. 按 document_id 合并,final = W_TITLE * title_rank + W_BODY * body_rank
18
+ * 3. 按 domainId 过滤(若传入,已在 SQL 下推)
19
+ * 4. 对每个匹配文档执行 canReadDocument 权限检查
20
+ * 5. 截取 topN 条结果
12
21
  *
13
22
  * @param visitorId 当前访客 ID(未登录为 null)
14
23
  */
15
24
  export function searchDocuments(params) {
16
25
  const db = getDb();
17
26
  const topN = params.topN ?? 10;
18
- // ---- 查询 FTS5 ----
19
- // 取足够多的候选结果(topN * 4),供权限过滤后仍有足够条目
20
- const ftsRows = queryFts(db, params.query, topN * 4, params.domainId);
21
- if (ftsRows.length === 0)
27
+ // 标题路少取一些即可;正文路多取供权限过滤后仍够
28
+ const titleRows = queryTitleFts(db, params.query, topN * 2, params.domainId);
29
+ const bodyRows = queryBodyFts(db, params.query, topN * 4, params.domainId);
30
+ const merged = mergeFtsHits(titleRows, bodyRows);
31
+ if (merged.length === 0)
22
32
  return [];
33
+ const metaById = loadDocumentSearchMeta(db, merged.map((r) => r.document_id));
23
34
  // ---- 权限过滤 ----
24
- // 收集涉及的各域信息,批量查询以复用
25
- const domainIds = Array.from(new Set(ftsRows.map((r) => r.domain_id)));
35
+ const domainIds = Array.from(new Set(merged.map((r) => r.domain_id)));
26
36
  const domainCache = new Map();
27
37
  for (const did of domainIds) {
28
38
  domainCache.set(did, findDomainById(db, did) ?? null);
29
39
  }
30
40
  const results = [];
31
- for (const row of ftsRows) {
32
- // 构造 DocumentRow 用于权限判定
41
+ for (const row of merged) {
33
42
  const docRow = {
34
43
  document_id: row.document_id,
35
44
  domain_id: row.domain_id,
@@ -52,70 +61,170 @@ export function searchDocuments(params) {
52
61
  const domainInfo = { domainPermission, isDomainMember: isMember };
53
62
  if (!canReadDocument(docRow, params.visitorId ?? null, domainInfo))
54
63
  continue;
55
- // 截取内容片段(最多 200 字符,从第一个匹配词附近开始)
56
- const snippet = extractSnippet(row.content, params.query, 200);
64
+ const snippet = row.bodyContent.length > 0
65
+ ? extractSnippet(row.bodyContent, params.query, 200)
66
+ : row.display_name || "标题命中";
67
+ const meta = metaById.get(row.document_id);
57
68
  results.push({
58
69
  documentId: row.document_id,
59
70
  displayName: row.display_name,
60
71
  relativePath: row.relative_path,
61
72
  domainId: row.domain_id,
62
73
  snippet,
63
- bm25Score: row.bm25_score != null ? row.bm25_score : 0,
74
+ bm25Score: row.finalScore,
75
+ ownerVisitorName: meta?.ownerVisitorName ?? "",
76
+ updatedAt: meta?.updatedAt ?? "",
64
77
  });
65
78
  if (results.length >= topN)
66
79
  break;
67
80
  }
68
81
  return results;
69
82
  }
83
+ /** 从主表批量取作者名与更新时间(不冗余进 FTS) */
84
+ function loadDocumentSearchMeta(db, documentIds) {
85
+ const out = new Map();
86
+ const ids = Array.from(new Set(documentIds.filter(Boolean)));
87
+ if (ids.length === 0)
88
+ return out;
89
+ const placeholders = ids.map(() => "?").join(",");
90
+ const rows = db
91
+ .prepare(`SELECT d.document_id, d.updated_at,
92
+ COALESCE(v.visitor_name, '') AS owner_visitor_name
93
+ FROM documents d
94
+ LEFT JOIN visitors v ON v.visitor_id = d.owner_visitor_id
95
+ WHERE d.document_id IN (${placeholders})`)
96
+ .all(...ids);
97
+ for (const row of rows) {
98
+ out.set(row.document_id, {
99
+ ownerVisitorName: row.owner_visitor_name,
100
+ updatedAt: row.updated_at,
101
+ });
102
+ }
103
+ return out;
104
+ }
70
105
  /**
71
- * 执行 FTS5 查询,返回按 BM25 排名升序排列的结果。
72
- *
73
- * @param db 数据库实例
74
- * @param query 用户输入的查询字符串
75
- * @param limit 返回数量上限
76
- * @param domainIdPattern 可选域过滤(通过 FTS5 UNINDEXED 列)
106
+ * FTS5 bm25:越小(越负)越好。映射到 (0, 1],越大越好。
107
+ * 使用 sigmoid,避免负分被 max(0,·) 压扁成同一档。
77
108
  */
78
- function queryFts(db, query, limit, domainIdPattern) {
79
- // 转义 FTS5 特殊字符,防止用户输入破坏查询语法
109
+ function rankFromBm25(bm25) {
110
+ return 1 / (1 + Math.exp(bm25));
111
+ }
112
+ function mergeFtsHits(titleRows, bodyRows) {
113
+ const map = new Map();
114
+ for (const row of titleRows) {
115
+ map.set(row.document_id, {
116
+ document_id: row.document_id,
117
+ display_name: row.display_name,
118
+ relative_path: row.relative_path,
119
+ domain_id: row.domain_id,
120
+ owner_visitor_id: row.owner_visitor_id,
121
+ permission: row.permission,
122
+ bodyContent: "",
123
+ titleRank: rankFromBm25(row.bm25_score),
124
+ bodyRank: 0,
125
+ });
126
+ }
127
+ for (const row of bodyRows) {
128
+ const existing = map.get(row.document_id);
129
+ if (existing) {
130
+ existing.bodyRank = rankFromBm25(row.bm25_score);
131
+ existing.bodyContent = row.content;
132
+ if (!existing.display_name)
133
+ existing.display_name = row.display_name;
134
+ if (!existing.relative_path)
135
+ existing.relative_path = row.relative_path;
136
+ }
137
+ else {
138
+ map.set(row.document_id, {
139
+ document_id: row.document_id,
140
+ display_name: row.display_name,
141
+ relative_path: row.relative_path,
142
+ domain_id: row.domain_id,
143
+ owner_visitor_id: row.owner_visitor_id,
144
+ permission: row.permission,
145
+ bodyContent: row.content,
146
+ titleRank: 0,
147
+ bodyRank: rankFromBm25(row.bm25_score),
148
+ });
149
+ }
150
+ }
151
+ return Array.from(map.values())
152
+ .map((row) => ({
153
+ document_id: row.document_id,
154
+ display_name: row.display_name,
155
+ relative_path: row.relative_path,
156
+ domain_id: row.domain_id,
157
+ owner_visitor_id: row.owner_visitor_id,
158
+ permission: row.permission,
159
+ bodyContent: row.bodyContent,
160
+ finalScore: W_TITLE * row.titleRank + W_BODY * row.bodyRank,
161
+ }))
162
+ .sort((a, b) => b.finalScore - a.finalScore);
163
+ }
164
+ function queryTitleFts(db, query, limit, domainIdPattern) {
165
+ const safeQuery = escapeFts5Query(query);
166
+ if (!safeQuery)
167
+ return [];
168
+ const domainClause = domainIdPattern ? "AND domain_id = ?" : "";
169
+ const params = domainIdPattern ? [safeQuery, domainIdPattern, limit] : [safeQuery, limit];
170
+ try {
171
+ return db
172
+ .prepare(`SELECT document_id, display_name, relative_path, domain_id, owner_visitor_id, permission,
173
+ bm25(documents_fts_title) AS bm25_score
174
+ FROM documents_fts_title
175
+ WHERE documents_fts_title MATCH ? ${domainClause}
176
+ ORDER BY bm25_score ASC
177
+ LIMIT ?`)
178
+ .all(...params);
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ function queryBodyFts(db, query, limit, domainIdPattern) {
80
185
  const safeQuery = escapeFts5Query(query);
81
186
  if (!safeQuery)
82
187
  return [];
83
- // 构造 SQL:MATCH 必须用字符串字面量,domain_id 用参数绑定防止注入
84
188
  const domainClause = domainIdPattern ? "AND domain_id = ?" : "";
85
189
  const params = domainIdPattern ? [safeQuery, domainIdPattern, limit] : [safeQuery, limit];
86
190
  try {
87
- return db.prepare(`SELECT document_id, display_name, relative_path, domain_id, owner_visitor_id, permission, content, bm25(documents_fts) AS bm25_score
88
- FROM documents_fts
89
- WHERE documents_fts MATCH ? ${domainClause}
90
- ORDER BY bm25_score ASC
91
- LIMIT ?`).all(...params);
191
+ return db
192
+ .prepare(`SELECT document_id, display_name, relative_path, domain_id, owner_visitor_id, permission, content,
193
+ bm25(documents_fts) AS bm25_score
194
+ FROM documents_fts
195
+ WHERE documents_fts MATCH ? ${domainClause}
196
+ ORDER BY bm25_score ASC
197
+ LIMIT ?`)
198
+ .all(...params);
92
199
  }
93
200
  catch {
94
- // FTS5 语法异常时返回空(如用户输入了无法解析的字符序列)
201
+ // FTS5 语法异常或表尚未就绪时返回空(降级:标题路仍可能有结果)
95
202
  return [];
96
203
  }
97
204
  }
98
205
  /**
99
- * 转义用户输入中可能破坏 FTS5 语法的特殊字符。
206
+ * 将用户查询分词并转义为 FTS5 MATCH 表达式。
100
207
  *
101
- * FTS5 特殊字符:* " + - ^ ( ) { } [ ] ~ . : 、空格
102
- * 将每个词用双引号包裹以避免特殊字符被解释为操作符。
208
+ * 索引写入侧对中文做了 jieba cutForSearch;查询必须同样分词,否则整句
209
+ * `"恢复码"` 无法命中已拆成 `恢复` / `码` 的索引。
210
+ * 每个 token 用双引号包裹,避免 FTS5 特殊字符被解释为操作符。
103
211
  */
104
212
  function escapeFts5Query(query) {
105
- const trimmed = query.trim();
213
+ const trimmed = query.trim().replace(/"/g, "");
106
214
  if (!trimmed)
107
215
  return "";
108
- // 移除引号避免破坏 FTS5 语法,按空白分词后每词用双引号包裹,词间 AND
109
- const sanitized = trimmed.replace(/"/g, "");
110
- const words = sanitized.split(/\s+/).filter((w) => w.length > 0);
216
+ const words = JIEBA.cutForSearch(trimmed, true)
217
+ .map((w) => w.trim())
218
+ .filter((w) => w.length > 0);
111
219
  if (words.length === 0)
112
220
  return "";
113
- return words.map((w) => `"${w}"`).join(" ");
221
+ // 去重:cutForSearch 会产出重叠 token
222
+ return Array.from(new Set(words)).map((w) => `"${w}"`).join(" ");
114
223
  }
115
224
  /**
116
225
  * 从文档内容中提取包含查询词的片段。
117
226
  *
118
- * @param text 文档全文
227
+ * @param text 文档全文(索引侧可能是分词后文本)
119
228
  * @param query 用户查询
120
229
  * @param maxLen 片段最大长度,默认 200 字符
121
230
  */
@@ -129,11 +238,10 @@ function extractSnippet(text, query, maxLen = 200) {
129
238
  // 未找到精确匹配(FTS 可能匹配了词干变体),返回开头
130
239
  return text.slice(0, maxLen) + "…";
131
240
  }
132
- // 从匹配位置开始前移一些字符,保证片段完整
133
- const start = Math.max(0, idx - 30);
241
+ const start = Math.max(0, idx - Math.floor(maxLen / 4));
134
242
  const end = Math.min(text.length, start + maxLen);
135
243
  const prefix = start > 0 ? "…" : "";
136
244
  const suffix = end < text.length ? "…" : "";
137
- return prefix + text.slice(start, end).replace(/\n/g, " ") + suffix;
245
+ return prefix + text.slice(start, end) + suffix;
138
246
  }
139
247
  //# sourceMappingURL=search.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../../src/server/search/search.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.service.js","sourceRoot":"","sources":["../../../src/server/search/search.service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,mCAAmC;AACnC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnC,mBAAmB;AACnB,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,aAAa;AACb,MAAM,MAAM,GAAG,GAAG,CAAC;AAgBnB;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,MAK/B;IACC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAE/B,0BAA0B;IAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,sBAAsB,CACrC,EAAE,EACF,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CACjC,CAAC;IAEF,iBAAiB;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,MAAM,GAAgB;YAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,UAAU,EAAE,GAAG,CAAC,gBAAgB;YAChC,UAAU,EAAE,GAAG,CAAC,gBAAgB;YAChC,YAAY,EAAE,EAAE;YAChB,cAAc,EAAE,IAAI;YACpB,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;SAChB,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,gBAAgB,GAAG,MAAM,EAAE,UAAU,IAAI,QAAQ,CAAC;QACxD,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,IAAI,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACvG,MAAM,UAAU,GAAqB,EAAE,gBAAgB,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;QAEpF,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,UAAU,CAAC;YAAE,SAAS;QAE7E,MAAM,OAAO,GACX,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;YACpD,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,MAAM,CAAC;QAEjC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAE3C,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,GAAG,CAAC,WAAW;YAC3B,WAAW,EAAE,GAAG,CAAC,YAAY;YAC7B,YAAY,EAAE,GAAG,CAAC,aAAa;YAC/B,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,OAAO;YACP,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,IAAI,EAAE;YAC9C,SAAS,EAAE,IAAI,EAAE,SAAS,IAAI,EAAE;SACjC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;YAAE,MAAM;IACpC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+BAA+B;AAC/B,SAAS,sBAAsB,CAC7B,EAAqB,EACrB,WAAqB;IAErB,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2D,CAAC;IAC/E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAEjC,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;iCAI2B,YAAY,GAAG,CAC3C;SACA,GAAG,CAAC,GAAG,GAAG,CAIX,CAAC;IAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE;YACvB,gBAAgB,EAAE,GAAG,CAAC,kBAAkB;YACxC,SAAS,EAAE,GAAG,CAAC,UAAU;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AA2BD;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,SAA0B,EAAE,QAAsB;IACtE,MAAM,GAAG,GAAG,IAAI,GAAG,EAahB,CAAC;IAEJ,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE;YACvB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;YACvC,QAAQ,EAAE,CAAC;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjD,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,YAAY;gBAAE,QAAQ,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAAE,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE;gBACvB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;gBACtC,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,SAAS,EAAE,CAAC;gBACZ,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;SAC5B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACb,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,OAAO,GAAG,GAAG,CAAC,SAAS,GAAG,MAAM,GAAG,GAAG,CAAC,QAAQ;KAC5D,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,aAAa,CACpB,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,eAAwB;IAExB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAc,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAErG,IAAI,CAAC;QACH,OAAO,EAAE;aACN,OAAO,CACN;;;6CAGqC,YAAY;;iBAExC,CACV;aACA,GAAG,CAAC,GAAG,MAAM,CAAoB,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,EAAqB,EACrB,KAAa,EACb,KAAa,EACb,eAAwB;IAExB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,MAAM,MAAM,GAAc,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAErG,IAAI,CAAC;QACH,OAAO,EAAE;aACN,OAAO,CACN;;;uCAG+B,YAAY;;iBAElC,CACV;aACA,GAAG,CAAC,GAAG,MAAM,CAAiB,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,8BAA8B;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa,EAAE,MAAM,GAAG,GAAG;IAC/D,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,8BAA8B;QAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAClD,CAAC"}