memento-mcp-server 1.12.0 → 1.13.0-a
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.
- package/dist/algorithms/forgetting-algorithm.d.ts +21 -13
- package/dist/algorithms/forgetting-algorithm.d.ts.map +1 -1
- package/dist/algorithms/forgetting-algorithm.js +32 -24
- package/dist/algorithms/forgetting-algorithm.js.map +1 -1
- package/dist/algorithms/hybrid-search-engine.d.ts +11 -9
- package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
- package/dist/algorithms/hybrid-search-engine.js +77 -75
- package/dist/algorithms/hybrid-search-engine.js.map +1 -1
- package/dist/algorithms/search-engine.d.ts +33 -11
- package/dist/algorithms/search-engine.d.ts.map +1 -1
- package/dist/algorithms/search-engine.js +157 -62
- package/dist/algorithms/search-engine.js.map +1 -1
- package/dist/algorithms/search-ranking.d.ts +57 -50
- package/dist/algorithms/search-ranking.d.ts.map +1 -1
- package/dist/algorithms/search-ranking.js +91 -84
- package/dist/algorithms/search-ranking.js.map +1 -1
- package/dist/algorithms/spaced-repetition.d.ts +18 -13
- package/dist/algorithms/spaced-repetition.d.ts.map +1 -1
- package/dist/algorithms/spaced-repetition.js +28 -23
- package/dist/algorithms/spaced-repetition.js.map +1 -1
- package/dist/algorithms/vector-search-engine-migration.d.ts +8 -6
- package/dist/algorithms/vector-search-engine-migration.d.ts.map +1 -1
- package/dist/algorithms/vector-search-engine-migration.js +13 -11
- package/dist/algorithms/vector-search-engine-migration.js.map +1 -1
- package/dist/algorithms/vector-search-engine-refactored.d.ts +7 -7
- package/dist/algorithms/vector-search-engine-refactored.d.ts.map +1 -1
- package/dist/algorithms/vector-search-engine-refactored.js +7 -7
- package/dist/algorithms/vector-search-engine-refactored.js.map +1 -1
- package/dist/algorithms/vector-search-engine.d.ts +25 -20
- package/dist/algorithms/vector-search-engine.d.ts.map +1 -1
- package/dist/algorithms/vector-search-engine.js +47 -43
- package/dist/algorithms/vector-search-engine.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +4 -1
- package/dist/config/index.js.map +1 -1
- package/dist/database/init.d.ts.map +1 -1
- package/dist/database/init.js +20 -0
- package/dist/database/init.js.map +1 -1
- package/dist/database/migration/migrations/006-fts5-reflection-notes-migration-status.sql +30 -0
- package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts +113 -0
- package/dist/database/migration/migrations/006-fts5-reflection-notes.d.ts.map +1 -0
- package/dist/database/migration/migrations/006-fts5-reflection-notes.js +435 -0
- package/dist/database/migration/migrations/006-fts5-reflection-notes.js.map +1 -0
- package/dist/database/migration/migrations/006-fts5-reflection-notes.sql +26 -0
- package/dist/database/schema.sql +11 -9
- package/dist/server/bootstrap.d.ts +4 -0
- package/dist/server/bootstrap.d.ts.map +1 -1
- package/dist/server/bootstrap.js +11 -1
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +3 -1
- package/dist/server/context.js.map +1 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +2 -1
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/index.js +3 -1
- package/dist/server/index.js.map +1 -1
- package/dist/services/async-optimizer.d.ts +2 -1
- package/dist/services/async-optimizer.d.ts.map +1 -1
- package/dist/services/async-optimizer.js +28 -1
- package/dist/services/async-optimizer.js.map +1 -1
- package/dist/services/batch-scheduler.d.ts +5 -1
- package/dist/services/batch-scheduler.d.ts.map +1 -1
- package/dist/services/batch-scheduler.js +13 -1
- package/dist/services/batch-scheduler.js.map +1 -1
- package/dist/services/cache-service.js +1 -1
- package/dist/services/cache-service.js.map +1 -1
- package/dist/services/failure-detector.d.ts +120 -0
- package/dist/services/failure-detector.d.ts.map +1 -0
- package/dist/services/failure-detector.js +370 -0
- package/dist/services/failure-detector.js.map +1 -0
- package/dist/services/llm-based-relation-extractor.js +1 -1
- package/dist/services/llm-based-relation-extractor.js.map +1 -1
- package/dist/services/reflexion-worker.d.ts +170 -0
- package/dist/services/reflexion-worker.d.ts.map +1 -0
- package/dist/services/reflexion-worker.js +636 -0
- package/dist/services/reflexion-worker.js.map +1 -0
- package/dist/services/relation-graph.d.ts +2 -2
- package/dist/services/relation-graph.js +3 -3
- package/dist/services/relation-graph.js.map +1 -1
- package/dist/tools/base-tool.d.ts +5 -0
- package/dist/tools/base-tool.d.ts.map +1 -1
- package/dist/tools/base-tool.js +39 -0
- package/dist/tools/base-tool.js.map +1 -1
- package/dist/tools/recall-tool.d.ts.map +1 -1
- package/dist/tools/recall-tool.js +36 -2
- package/dist/tools/recall-tool.js.map +1 -1
- package/dist/tools/remember-tool.d.ts +24 -0
- package/dist/tools/remember-tool.d.ts.map +1 -1
- package/dist/tools/remember-tool.js +445 -273
- package/dist/tools/remember-tool.js.map +1 -1
- package/dist/tools/types.d.ts +5 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +1 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/database.d.ts.map +1 -1
- package/dist/utils/database.js +34 -10
- package/dist/utils/database.js.map +1 -1
- package/dist/utils/fts5-migration-status.d.ts +72 -0
- package/dist/utils/fts5-migration-status.d.ts.map +1 -0
- package/dist/utils/fts5-migration-status.js +304 -0
- package/dist/utils/fts5-migration-status.js.map +1 -0
- package/dist/utils/reflection-notes-merge.d.ts +58 -0
- package/dist/utils/reflection-notes-merge.d.ts.map +1 -0
- package/dist/utils/reflection-notes-merge.js +227 -0
- package/dist/utils/reflection-notes-merge.js.map +1 -0
- package/dist/utils/reflection-notes-normalize.d.ts +43 -0
- package/dist/utils/reflection-notes-normalize.d.ts.map +1 -0
- package/dist/utils/reflection-notes-normalize.js +164 -0
- package/dist/utils/reflection-notes-normalize.js.map +1 -0
- package/dist/utils/reflection-notes-schema.d.ts +84 -0
- package/dist/utils/reflection-notes-schema.d.ts.map +1 -0
- package/dist/utils/reflection-notes-schema.js +215 -0
- package/dist/utils/reflection-notes-schema.js.map +1 -0
- package/package.json +3 -1
- package/src/database/schema.sql +11 -9
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* FTS5
|
|
2
|
+
* FTS5와 랭킹 알고리즘을 결합하여 검색 정확도와 성능을 동시에 확보합니다.
|
|
3
|
+
* 전문 검색 인덱스(FTS5)로 빠른 검색을 수행하고, 다차원 랭킹 알고리즘으로 관련성 높은 결과를 제공합니다.
|
|
4
4
|
*/
|
|
5
5
|
import type { MemorySearchFilters, MemorySearchResult } from '../types/index.js';
|
|
6
6
|
export interface SearchQuery {
|
|
@@ -12,7 +12,8 @@ export declare class SearchEngine {
|
|
|
12
12
|
private ranking;
|
|
13
13
|
constructor();
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 전문 검색 성능을 향상시키고 관련성 높은 결과를 빠르게 반환합니다.
|
|
16
|
+
* FTS5 인덱스를 활용하여 대용량 데이터에서도 빠른 검색이 가능하도록 최적화합니다.
|
|
16
17
|
*/
|
|
17
18
|
search(db: any, query: SearchQuery): Promise<{
|
|
18
19
|
items: MemorySearchResult[];
|
|
@@ -20,32 +21,53 @@ export declare class SearchEngine {
|
|
|
20
21
|
query_time: number;
|
|
21
22
|
}>;
|
|
22
23
|
/**
|
|
23
|
-
* FTS5 검색
|
|
24
|
-
* 아키텍처
|
|
24
|
+
* FTS5의 특수 문법과 보안 요구사항을 준수하여 안전하고 효율적인 검색 쿼리를 생성합니다.
|
|
25
|
+
* 아키텍처 문서의 전처리 규칙을 적용하여 검색 정확도를 향상시킵니다.
|
|
25
26
|
*/
|
|
26
27
|
private buildFTSQuery;
|
|
27
28
|
/**
|
|
28
|
-
*
|
|
29
|
+
* 검색 품질을 향상시키기 위해 노이즈를 제거하고 핵심 키워드만 추출합니다.
|
|
30
|
+
* 아키텍처 문서의 전처리 규칙을 준수하여 일관된 검색 결과를 제공합니다.
|
|
29
31
|
*/
|
|
30
32
|
private preprocessQuery;
|
|
31
33
|
/**
|
|
32
|
-
* FTS5
|
|
34
|
+
* FTS5의 특수문자 처리 규칙을 준수하여 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
|
|
33
35
|
*/
|
|
34
36
|
private makeFTSSafe;
|
|
35
37
|
/**
|
|
36
|
-
*
|
|
38
|
+
* 준비된 SQL 쿼리를 실행하여 실제 검색 결과를 데이터베이스에서 획득합니다.
|
|
37
39
|
*/
|
|
38
40
|
private executeQuery;
|
|
39
41
|
/**
|
|
40
|
-
*
|
|
42
|
+
* FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
|
|
43
|
+
* 관련성, 최근성, 중요도, 사용성 등을 종합적으로 고려하여 검색 품질을 향상시킵니다.
|
|
41
44
|
*/
|
|
42
45
|
private applyRanking;
|
|
43
46
|
/**
|
|
44
|
-
* FTS5
|
|
47
|
+
* FTS5 인덱스의 존재와 동작 여부를 확인하여 안전한 검색 전략을 선택합니다.
|
|
48
|
+
* 인덱스가 없거나 비정상인 경우 대체 검색 방식을 사용하여 기능 안정성을 보장합니다.
|
|
45
49
|
*/
|
|
46
50
|
private checkFTS5Availability;
|
|
47
51
|
/**
|
|
48
|
-
*
|
|
52
|
+
* reflection_notes 컬럼이 FTS5에서 사용 가능한지 확인
|
|
53
|
+
* 마이그레이션 상태를 확인하여 Fallback이 필요한지 판단합니다.
|
|
54
|
+
*
|
|
55
|
+
* @param db - 데이터베이스 인스턴스
|
|
56
|
+
* @returns reflection_notes 컬럼 사용 가능 여부
|
|
57
|
+
*/
|
|
58
|
+
private checkReflectionNotesAvailability;
|
|
59
|
+
/**
|
|
60
|
+
* reflection_notes 검색 쿼리 빌더
|
|
61
|
+
* 마이그레이션 상태에 따라 FTS5 MATCH 쿼리 또는 LIKE 쿼리를 선택합니다.
|
|
62
|
+
*
|
|
63
|
+
* @param db - 데이터베이스 인스턴스
|
|
64
|
+
* @param searchQuery - 검색 쿼리
|
|
65
|
+
* @returns reflection_notes 검색 조건 (SQL WHERE 절 조건)
|
|
66
|
+
*/
|
|
67
|
+
private buildReflectionNotesSearchCondition;
|
|
68
|
+
/**
|
|
69
|
+
* 사용자에게 검색 결과가 선택된 이유를 명확히 전달하여 검색 결과의 신뢰성을 높입니다.
|
|
70
|
+
* 관련성, 최근성, 중요도 등 다양한 요소를 종합하여 투명한 검색 과정을 제공합니다.
|
|
49
71
|
*/
|
|
50
72
|
private generateRecallReason;
|
|
51
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMjF,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAGD,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgB;;IAM/B;;;OAGG;IACG,MAAM,CACV,EAAE,EAAE,GAAG,EACP,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;QAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAwKpF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAwBrB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;YACW,YAAY;IAK1B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuGpB;;;OAGG;YACW,qBAAqB;IAqCnC;;;;;;OAMG;IACH,OAAO,CAAC,gCAAgC;IAuCxC;;;;;;;OAOG;IACH,OAAO,CAAC,mCAAmC;IAmB3C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CA2B7B"}
|
|
@@ -1,39 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* FTS5
|
|
2
|
+
* FTS5와 랭킹 알고리즘을 결합하여 검색 정확도와 성능을 동시에 확보합니다.
|
|
3
|
+
* 전문 검색 인덱스(FTS5)로 빠른 검색을 수행하고, 다차원 랭킹 알고리즘으로 관련성 높은 결과를 제공합니다.
|
|
4
4
|
*/
|
|
5
5
|
import { SearchRanking } from './search-ranking.js';
|
|
6
6
|
import Database from 'better-sqlite3';
|
|
7
7
|
import { getStopWords } from '../utils/stopwords.js';
|
|
8
8
|
import { mementoConfig } from '../config/index.js';
|
|
9
|
+
import { shouldUseFallback } from '../utils/fts5-migration-status.js';
|
|
9
10
|
export class SearchEngine {
|
|
10
11
|
ranking;
|
|
11
12
|
constructor() {
|
|
12
13
|
this.ranking = new SearchRanking();
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* 전문 검색 성능을 향상시키고 관련성 높은 결과를 빠르게 반환합니다.
|
|
17
|
+
* FTS5 인덱스를 활용하여 대용량 데이터에서도 빠른 검색이 가능하도록 최적화합니다.
|
|
16
18
|
*/
|
|
17
19
|
async search(db, query) {
|
|
18
20
|
const startTime = process.hrtime.bigint();
|
|
19
21
|
const { query: searchQuery, filters, limit = 10 } = query;
|
|
20
|
-
//
|
|
22
|
+
// ID로 직접 조회할 때는 이미 대상이 명확하므로 불필요한 텍스트 검색을 생략하여 성능을 최적화합니다.
|
|
21
23
|
const hasIdFilter = filters?.id && filters.id.length > 0;
|
|
22
24
|
let sql;
|
|
23
25
|
const params = [];
|
|
24
|
-
//
|
|
26
|
+
// 전문 검색 인덱스를 활용하여 빠르고 정확한 검색 결과를 제공합니다.
|
|
25
27
|
if (!hasIdFilter && searchQuery.trim().length > 0) {
|
|
26
|
-
// FTS5
|
|
28
|
+
// FTS5 인덱스가 없으면 쿼리 오류가 발생할 수 있으므로, 인덱스가 준비되어 있는지 확인하여 안전한 검색을 보장합니다.
|
|
27
29
|
const ftsAvailable = await this.checkFTS5Availability(db);
|
|
28
30
|
if (ftsAvailable) {
|
|
29
31
|
const ftsQuery = this.buildFTSQuery(searchQuery);
|
|
30
|
-
// 빈
|
|
32
|
+
// 빈 쿼리로 인한 FTS5 오류를 방지하고 모든 결과를 반환합니다.
|
|
31
33
|
if (ftsQuery === '""' || ftsQuery.length === 0) {
|
|
32
34
|
sql = `
|
|
33
35
|
SELECT
|
|
34
36
|
m.id, m.content, m.type, m.importance, m.created_at,
|
|
35
37
|
m.last_accessed, m.pinned, m.tags, m.source,
|
|
36
38
|
m.consolidation_score,
|
|
39
|
+
m.task_goal, m.steps, m.reflection_notes,
|
|
40
|
+
m.privacy_scope, m.origin_source,
|
|
37
41
|
0 as fts_rank
|
|
38
42
|
FROM memory_item m
|
|
39
43
|
`;
|
|
@@ -44,6 +48,8 @@ export class SearchEngine {
|
|
|
44
48
|
m.id, m.content, m.type, m.importance, m.created_at,
|
|
45
49
|
m.last_accessed, m.pinned, m.tags, m.source,
|
|
46
50
|
m.consolidation_score,
|
|
51
|
+
m.task_goal, m.steps, m.reflection_notes,
|
|
52
|
+
m.privacy_scope, m.origin_source,
|
|
47
53
|
memory_item_fts.rank as fts_rank
|
|
48
54
|
FROM memory_item_fts
|
|
49
55
|
JOIN memory_item m ON memory_item_fts.rowid = m.rowid
|
|
@@ -53,38 +59,50 @@ export class SearchEngine {
|
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
else {
|
|
56
|
-
// FTS5가
|
|
62
|
+
// FTS5가 없는 환경에서도 검색 기능이 동작하도록 호환성을 보장합니다.
|
|
57
63
|
const likeQuery = `%${searchQuery}%`;
|
|
64
|
+
// reflection_notes 검색 조건 추가 (Fallback)
|
|
65
|
+
const reflectionNotesCondition = this.buildReflectionNotesSearchCondition(db, searchQuery);
|
|
66
|
+
const reflectionNotesLike = reflectionNotesCondition ? ` OR ${reflectionNotesCondition}` : '';
|
|
67
|
+
const reflectionNotesParams = reflectionNotesCondition ? [likeQuery] : [];
|
|
58
68
|
sql = `
|
|
59
69
|
SELECT
|
|
60
70
|
m.id, m.content, m.type, m.importance, m.created_at,
|
|
61
71
|
m.last_accessed, m.pinned, m.tags, m.source,
|
|
62
72
|
m.consolidation_score,
|
|
73
|
+
m.task_goal, m.steps, m.reflection_notes,
|
|
74
|
+
m.privacy_scope, m.origin_source,
|
|
63
75
|
0 as fts_rank
|
|
64
76
|
FROM memory_item m
|
|
65
|
-
WHERE m.content LIKE ? OR m.tags LIKE ? OR m.source LIKE
|
|
77
|
+
WHERE m.content LIKE ? OR m.tags LIKE ? OR m.source LIKE ?${reflectionNotesLike}
|
|
66
78
|
`;
|
|
67
|
-
params.push(likeQuery, likeQuery, likeQuery);
|
|
79
|
+
params.push(likeQuery, likeQuery, likeQuery, ...reflectionNotesParams);
|
|
68
80
|
}
|
|
69
81
|
}
|
|
70
82
|
else {
|
|
71
|
-
//
|
|
83
|
+
// ID 필터나 빈 검색어 상황에서 효율적인 직접 조회를 수행합니다.
|
|
72
84
|
sql = `
|
|
73
85
|
SELECT
|
|
74
86
|
m.id, m.content, m.type, m.importance, m.created_at,
|
|
75
87
|
m.last_accessed, m.pinned, m.tags, m.source,
|
|
76
88
|
m.consolidation_score,
|
|
89
|
+
m.task_goal, m.steps, m.reflection_notes,
|
|
90
|
+
m.privacy_scope, m.origin_source,
|
|
77
91
|
0 as fts_rank
|
|
78
92
|
FROM memory_item m
|
|
79
93
|
`;
|
|
80
|
-
//
|
|
94
|
+
// 검색어가 있을 때만 텍스트 매칭을 수행하여 불필요한 연산을 방지합니다.
|
|
81
95
|
if (!hasIdFilter && searchQuery.trim().length > 0) {
|
|
82
96
|
const likeQuery = `%${searchQuery}%`;
|
|
83
|
-
|
|
84
|
-
|
|
97
|
+
// reflection_notes 검색 조건 추가 (Fallback)
|
|
98
|
+
const reflectionNotesCondition = this.buildReflectionNotesSearchCondition(db, searchQuery);
|
|
99
|
+
const reflectionNotesLike = reflectionNotesCondition ? ` OR ${reflectionNotesCondition}` : '';
|
|
100
|
+
const reflectionNotesParams = reflectionNotesCondition ? [likeQuery] : [];
|
|
101
|
+
sql += ` WHERE m.content LIKE ?${reflectionNotesLike}`;
|
|
102
|
+
params.push(likeQuery, ...reflectionNotesParams);
|
|
85
103
|
}
|
|
86
104
|
}
|
|
87
|
-
//
|
|
105
|
+
// 사용자가 요청한 타입, 중요도, 시간 범위 등의 필터를 적용하여 정확한 결과를 제공합니다.
|
|
88
106
|
const conditions = [];
|
|
89
107
|
if (filters?.id && filters.id.length > 0) {
|
|
90
108
|
conditions.push(`m.id IN (${filters.id.map(() => '?').join(',')})`);
|
|
@@ -100,7 +118,7 @@ export class SearchEngine {
|
|
|
100
118
|
}
|
|
101
119
|
if (filters?.pinned !== undefined) {
|
|
102
120
|
conditions.push(`m.pinned = ?`);
|
|
103
|
-
params.push(filters.pinned ? 1 : 0); // boolean을 숫자로
|
|
121
|
+
params.push(filters.pinned ? 1 : 0); // SQLite가 boolean을 지원하지 않으므로 숫자로 변환하여 저장합니다.
|
|
104
122
|
}
|
|
105
123
|
if (filters?.time_from) {
|
|
106
124
|
conditions.push(`m.created_at >= ?`);
|
|
@@ -110,26 +128,34 @@ export class SearchEngine {
|
|
|
110
128
|
conditions.push(`m.created_at <= ?`);
|
|
111
129
|
params.push(filters.time_to);
|
|
112
130
|
}
|
|
131
|
+
if (filters?.has_reflection_notes !== undefined) {
|
|
132
|
+
if (filters.has_reflection_notes) {
|
|
133
|
+
conditions.push(`m.reflection_notes IS NOT NULL`);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
conditions.push(`m.reflection_notes IS NULL`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
113
139
|
// WHERE 절 추가
|
|
114
140
|
if (conditions.length > 0) {
|
|
115
141
|
const whereClause = sql.includes('WHERE') ? ' AND ' : ' WHERE ';
|
|
116
142
|
sql += whereClause + conditions.join(' AND ');
|
|
117
143
|
}
|
|
118
|
-
//
|
|
144
|
+
// FTS5 랭킹을 고려하여 충분한 후보를 확보한 후 재랭킹하여 최종 결과의 품질을 보장합니다.
|
|
119
145
|
sql += ` ORDER BY fts_rank DESC, m.created_at DESC LIMIT ?`;
|
|
120
|
-
params.push(limit * 3); // FTS5
|
|
121
|
-
//
|
|
146
|
+
params.push(limit * 3); // FTS5 랭킹과 재랭킹 과정에서 일부 결과가 제외될 수 있으므로 충분한 후보를 확보합니다.
|
|
147
|
+
// 구성된 쿼리를 실행하여 실제 검색 결과를 획득합니다.
|
|
122
148
|
console.log('🔍 검색 쿼리:', sql);
|
|
123
149
|
console.log('🔍 검색 파라미터:', params);
|
|
124
150
|
const results = await this.executeQuery(db, sql, params);
|
|
125
151
|
console.log('🔍 검색 결과 개수:', results.length);
|
|
126
|
-
//
|
|
152
|
+
// FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
|
|
127
153
|
const rankedResults = this.applyRanking(results, searchQuery);
|
|
128
|
-
//
|
|
154
|
+
// 사용자가 요청한 개수만큼만 반환하여 응답 크기와 처리 시간을 최적화합니다.
|
|
129
155
|
const finalResults = rankedResults.slice(0, limit);
|
|
130
|
-
//
|
|
156
|
+
// 검색 성능을 모니터링하고 최적화 지점을 파악합니다.
|
|
131
157
|
const endTime = process.hrtime.bigint();
|
|
132
|
-
const queryTime = Number(endTime - startTime) / 1_000_000; // 밀리초로
|
|
158
|
+
const queryTime = Number(endTime - startTime) / 1_000_000; // 나노초 단위 시간을 밀리초로 변환하여 사용자에게 이해하기 쉬운 형태로 제공합니다.
|
|
133
159
|
return {
|
|
134
160
|
items: finalResults,
|
|
135
161
|
total_count: finalResults.length,
|
|
@@ -137,105 +163,107 @@ export class SearchEngine {
|
|
|
137
163
|
};
|
|
138
164
|
}
|
|
139
165
|
/**
|
|
140
|
-
* FTS5 검색
|
|
141
|
-
* 아키텍처
|
|
166
|
+
* FTS5의 특수 문법과 보안 요구사항을 준수하여 안전하고 효율적인 검색 쿼리를 생성합니다.
|
|
167
|
+
* 아키텍처 문서의 전처리 규칙을 적용하여 검색 정확도를 향상시킵니다.
|
|
142
168
|
*/
|
|
143
169
|
buildFTSQuery(query) {
|
|
144
170
|
console.log('🔍 원본 쿼리:', `"${query}"`);
|
|
145
|
-
//
|
|
171
|
+
// 사용자 입력의 형식이 다양하므로 정규화하여 검색 일관성을 보장합니다.
|
|
146
172
|
const preprocessedQuery = this.preprocessQuery(query);
|
|
147
173
|
console.log('🔍 전처리 후:', `"${preprocessedQuery}"`);
|
|
148
174
|
if (preprocessedQuery.length === 0) {
|
|
149
175
|
console.log('🔍 빈 쿼리, 모든 문서 검색');
|
|
150
|
-
return '""'; // 빈 쿼리인 경우 빈 문자열로
|
|
176
|
+
return '""'; // 빈 쿼리인 경우 빈 문자열로 검색하여 모든 문서를 매치하고 사용자에게 전체 결과를 제공합니다.
|
|
151
177
|
}
|
|
152
|
-
//
|
|
178
|
+
// FTS5 특수문자로 인한 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
|
|
153
179
|
const safeQuery = this.makeFTSSafe(preprocessedQuery);
|
|
154
180
|
console.log('🔍 FTS5 안전 쿼리:', `"${safeQuery}"`);
|
|
155
181
|
if (safeQuery.length === 0) {
|
|
156
182
|
console.log('🔍 안전 쿼리 빈 문자열, 모든 문서 검색');
|
|
157
|
-
return '""'; // 빈 쿼리인 경우 빈 문자열로
|
|
183
|
+
return '""'; // 빈 쿼리인 경우 빈 문자열로 검색하여 모든 문서를 매치하고 사용자에게 전체 결과를 제공합니다.
|
|
158
184
|
}
|
|
159
185
|
return safeQuery;
|
|
160
186
|
}
|
|
161
187
|
/**
|
|
162
|
-
*
|
|
188
|
+
* 검색 품질을 향상시키기 위해 노이즈를 제거하고 핵심 키워드만 추출합니다.
|
|
189
|
+
* 아키텍처 문서의 전처리 규칙을 준수하여 일관된 검색 결과를 제공합니다.
|
|
163
190
|
*/
|
|
164
191
|
preprocessQuery(query) {
|
|
165
|
-
//
|
|
192
|
+
// 다양한 공백 패턴을 통일하여 검색 일관성을 보장합니다.
|
|
166
193
|
let processed = query.trim().replace(/\s+/g, ' ');
|
|
167
|
-
//
|
|
194
|
+
// 검색에 방해되는 특수문자를 제거하여 핵심 키워드만 추출합니다.
|
|
168
195
|
processed = processed.replace(/[^a-zA-Z0-9가-힣\s]/g, ' ');
|
|
169
|
-
//
|
|
196
|
+
// 정규화 과정에서 생긴 연속 공백을 정리하여 쿼리 품질을 향상시킵니다.
|
|
170
197
|
processed = processed.replace(/\s+/g, ' ');
|
|
171
|
-
//
|
|
198
|
+
// 검색 가치가 없는 불용어를 제거하여 검색 정확도를 향상시킵니다.
|
|
172
199
|
const stopWords = getStopWords();
|
|
173
200
|
const words = processed.split(' ').filter(word => word.length > 0 && !stopWords.has(word.toLowerCase()));
|
|
174
|
-
//
|
|
201
|
+
// FTS5가 요구하는 형식으로 쿼리를 구성하여 인덱스 검색이 정상 동작하도록 합니다.
|
|
175
202
|
return words.join(' ');
|
|
176
203
|
}
|
|
177
204
|
/**
|
|
178
|
-
* FTS5
|
|
205
|
+
* FTS5의 특수문자 처리 규칙을 준수하여 쿼리 오류를 방지하고 안전한 검색을 보장합니다.
|
|
179
206
|
*/
|
|
180
207
|
makeFTSSafe(query) {
|
|
181
|
-
// FTS5
|
|
208
|
+
// FTS5가 특수문자를 쿼리 구문으로 해석하지 않도록 이스케이프하여 오류를 방지합니다.
|
|
182
209
|
return query
|
|
183
|
-
.replace(/"/g, '""') //
|
|
184
|
-
.replace(/'/g, "''") //
|
|
210
|
+
.replace(/"/g, '""') // FTS5가 따옴표를 특수문자로 해석하지 않도록 이스케이프합니다.
|
|
211
|
+
.replace(/'/g, "''") // FTS5가 작은따옴표를 특수문자로 해석하지 않도록 이스케이프합니다.
|
|
185
212
|
.replace(/[[\]{}()]/g, ' ') // 대괄호, 중괄호, 소괄호 제거
|
|
186
213
|
.replace(/\s+/g, ' ') // 연속 공백 정리
|
|
187
214
|
.trim();
|
|
188
215
|
}
|
|
189
216
|
/**
|
|
190
|
-
*
|
|
217
|
+
* 준비된 SQL 쿼리를 실행하여 실제 검색 결과를 데이터베이스에서 획득합니다.
|
|
191
218
|
*/
|
|
192
219
|
async executeQuery(db, sql, params) {
|
|
193
|
-
// better-sqlite3
|
|
220
|
+
// better-sqlite3의 동기적 특성을 활용하여 간단하고 효율적인 쿼리 실행을 수행합니다.
|
|
194
221
|
return db.prepare(sql).all(params);
|
|
195
222
|
}
|
|
196
223
|
/**
|
|
197
|
-
*
|
|
224
|
+
* FTS5 랭킹과 다차원 점수를 결합하여 사용자에게 가장 관련성 높은 결과를 우선 제공합니다.
|
|
225
|
+
* 관련성, 최근성, 중요도, 사용성 등을 종합적으로 고려하여 검색 품질을 향상시킵니다.
|
|
198
226
|
*/
|
|
199
227
|
applyRanking(results, query) {
|
|
200
228
|
const selectedContents = [];
|
|
201
229
|
return results
|
|
202
230
|
.map((row) => {
|
|
203
|
-
// FTS5 랭킹이 있으면
|
|
231
|
+
// FTS5 랭킹이 있으면 우선 활용하고, 없으면 텍스트 매칭으로 관련성을 계산하여 일관된 점수 체계를 유지합니다.
|
|
204
232
|
const ftsRank = row.fts_rank || 0;
|
|
205
233
|
const relevance = ftsRank > 0 ?
|
|
206
|
-
Math.min(ftsRank / 100, 1.0) : // FTS5 랭킹을 0-1 범위로
|
|
234
|
+
Math.min(ftsRank / 100, 1.0) : // FTS5 랭킹을 0-1 범위로 정규화하여 다른 점수와 일관된 비교가 가능하도록 합니다.
|
|
207
235
|
this.ranking.calculateRelevance({
|
|
208
236
|
query,
|
|
209
237
|
content: row.content,
|
|
210
238
|
tags: row.tags ? JSON.parse(row.tags) : []
|
|
211
239
|
});
|
|
212
|
-
//
|
|
240
|
+
// 시간에 따른 기억의 자연스러운 감쇠를 반영하여 최신 정보를 우선 제공합니다.
|
|
213
241
|
const recency = this.ranking.calculateRecency(new Date(row.created_at), row.type);
|
|
214
|
-
//
|
|
242
|
+
// 사용자가 명시적으로 설정한 중요도와 고정 여부를 반영하여 우선순위를 결정합니다.
|
|
215
243
|
const importance = this.ranking.calculateImportance(row.importance, row.pinned, row.type);
|
|
216
|
-
//
|
|
244
|
+
// 실제 사용 빈도를 반영하여 자주 참조되는 기억을 우선 제공합니다.
|
|
217
245
|
const usage = this.ranking.calculateUsage({
|
|
218
|
-
viewCount: 1, //
|
|
246
|
+
viewCount: 1, // 사용 빈도 데이터가 없는 경우 기본값을 사용하여 안정적인 점수 계산을 보장합니다.
|
|
219
247
|
citeCount: 0,
|
|
220
248
|
editCount: 0
|
|
221
249
|
});
|
|
222
|
-
// 중복
|
|
250
|
+
// 유사한 내용의 중복 결과를 제거하여 검색 결과의 다양성을 확보합니다.
|
|
223
251
|
const duplicationPenalty = this.ranking.calculateDuplicationPenalty(row.content, selectedContents);
|
|
224
|
-
//
|
|
252
|
+
// 통합 점수 기능이 활성화된 경우 추가적인 관련성 지표를 활용합니다.
|
|
225
253
|
const consolidationScore = row.consolidation_score !== null && row.consolidation_score !== undefined
|
|
226
254
|
? Number(row.consolidation_score)
|
|
227
255
|
: undefined;
|
|
228
256
|
// 최종 점수 계산
|
|
229
257
|
let finalScore;
|
|
230
|
-
//
|
|
258
|
+
// 통합 점수 기능을 통해 더 정교한 관련성 평가를 수행하여 검색 품질을 향상시킵니다.
|
|
231
259
|
if (mementoConfig.consolidationScoreEnabled && consolidationScore !== undefined) {
|
|
232
|
-
// 벡터
|
|
260
|
+
// 벡터 검색 결과를 텍스트 관련성과 동일한 의미로 해석하여 일관된 점수 계산을 수행합니다.
|
|
233
261
|
const vectorSimilarity = relevance;
|
|
234
|
-
finalScore = this.ranking.calculateFinalScoreWithConsolidation(vectorSimilarity, consolidationScore, 'balanced' //
|
|
262
|
+
finalScore = this.ranking.calculateFinalScoreWithConsolidation(vectorSimilarity, consolidationScore, 'balanced' // 기본적으로 균형잡힌 점수 계산을 사용하고, 향후 사용자 요구에 따라 조정 가능하도록 설계했습니다.
|
|
235
263
|
);
|
|
236
264
|
}
|
|
237
265
|
else {
|
|
238
|
-
//
|
|
266
|
+
// 통합 점수가 없는 경우 기존의 검증된 점수 계산 방식을 사용하여 안정성을 보장합니다.
|
|
239
267
|
finalScore = ftsRank > 0 ?
|
|
240
268
|
ftsRank * 0.7 + this.ranking.calculateFinalScore({
|
|
241
269
|
relevance: 0.3,
|
|
@@ -252,7 +280,7 @@ export class SearchEngine {
|
|
|
252
280
|
duplication_penalty: duplicationPenalty
|
|
253
281
|
});
|
|
254
282
|
}
|
|
255
|
-
// 선택된
|
|
283
|
+
// 중복 패널티 계산을 위해 이미 선택된 콘텐츠를 추적하여 결과의 다양성을 확보합니다.
|
|
256
284
|
selectedContents.push(row.content);
|
|
257
285
|
const result = {
|
|
258
286
|
id: row.id,
|
|
@@ -266,20 +294,21 @@ export class SearchEngine {
|
|
|
266
294
|
score: finalScore,
|
|
267
295
|
recall_reason: this.generateRecallReason(relevance, recency, importance, finalScore, ftsRank > 0)
|
|
268
296
|
};
|
|
269
|
-
//
|
|
297
|
+
// 통합 점수 기능이 활성화된 경우 결과에 추가 정보를 포함하여 상세한 분석을 가능하게 합니다.
|
|
270
298
|
if (mementoConfig.consolidationScoreEnabled && consolidationScore !== undefined) {
|
|
271
299
|
result.consolidation_score = consolidationScore;
|
|
272
300
|
}
|
|
273
301
|
return result;
|
|
274
302
|
})
|
|
275
|
-
.sort((a, b) => b.score - a.score); // 점수 내림차순
|
|
303
|
+
.sort((a, b) => b.score - a.score); // 최종 점수 기준으로 내림차순 정렬하여 가장 관련성 높은 결과를 우선 제공합니다.
|
|
276
304
|
}
|
|
277
305
|
/**
|
|
278
|
-
* FTS5
|
|
306
|
+
* FTS5 인덱스의 존재와 동작 여부를 확인하여 안전한 검색 전략을 선택합니다.
|
|
307
|
+
* 인덱스가 없거나 비정상인 경우 대체 검색 방식을 사용하여 기능 안정성을 보장합니다.
|
|
279
308
|
*/
|
|
280
309
|
async checkFTS5Availability(db) {
|
|
281
310
|
try {
|
|
282
|
-
// FTS5
|
|
311
|
+
// FTS5 인덱스 테이블이 생성되어 있는지 확인하여 전문 검색 사용 가능 여부를 판단합니다.
|
|
283
312
|
const result = db.prepare(`
|
|
284
313
|
SELECT name FROM sqlite_master
|
|
285
314
|
WHERE type='table' AND name='memory_item_fts'
|
|
@@ -288,14 +317,14 @@ export class SearchEngine {
|
|
|
288
317
|
console.log('⚠️ FTS5 테이블이 존재하지 않음, 기본 검색으로 전환');
|
|
289
318
|
return false;
|
|
290
319
|
}
|
|
291
|
-
//
|
|
320
|
+
// 빈 인덱스로 인한 검색 실패를 방지하고 실제 검색 가능 여부를 확인합니다.
|
|
292
321
|
const count = db.prepare('SELECT COUNT(*) as count FROM memory_item_fts').get();
|
|
293
322
|
const hasData = count && count.count > 0;
|
|
294
323
|
if (!hasData) {
|
|
295
324
|
console.log('⚠️ FTS5 테이블에 데이터가 없음, 기본 검색으로 전환');
|
|
296
325
|
return false;
|
|
297
326
|
}
|
|
298
|
-
// FTS5
|
|
327
|
+
// FTS5 쿼리가 실제로 동작하는지 테스트하여 런타임 오류를 사전에 방지합니다.
|
|
299
328
|
try {
|
|
300
329
|
db.prepare('SELECT * FROM memory_item_fts LIMIT 1').get();
|
|
301
330
|
console.log('✅ FTS5 사용 가능');
|
|
@@ -312,7 +341,73 @@ export class SearchEngine {
|
|
|
312
341
|
}
|
|
313
342
|
}
|
|
314
343
|
/**
|
|
315
|
-
*
|
|
344
|
+
* reflection_notes 컬럼이 FTS5에서 사용 가능한지 확인
|
|
345
|
+
* 마이그레이션 상태를 확인하여 Fallback이 필요한지 판단합니다.
|
|
346
|
+
*
|
|
347
|
+
* @param db - 데이터베이스 인스턴스
|
|
348
|
+
* @returns reflection_notes 컬럼 사용 가능 여부
|
|
349
|
+
*/
|
|
350
|
+
checkReflectionNotesAvailability(db) {
|
|
351
|
+
// 환경 변수로 강제 Fallback 활성화 확인
|
|
352
|
+
if (process.env.MEMENTO_FTS5_FALLBACK_ENABLED === 'true') {
|
|
353
|
+
console.log('⚠️ 환경 변수로 인해 reflection_notes Fallback 활성화');
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
// 마이그레이션 상태 확인
|
|
357
|
+
if (shouldUseFallback(db)) {
|
|
358
|
+
console.log('⚠️ 마이그레이션 상태로 인해 reflection_notes Fallback 사용');
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
// FTS5 테이블에 reflection_notes 컬럼이 있는지 확인
|
|
362
|
+
try {
|
|
363
|
+
const tableInfo = db.prepare(`
|
|
364
|
+
SELECT sql FROM sqlite_master
|
|
365
|
+
WHERE type='table' AND name='memory_item_fts'
|
|
366
|
+
`).get();
|
|
367
|
+
if (!tableInfo) {
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
// reflection_notes 컬럼이 포함되어 있는지 확인
|
|
371
|
+
const hasReflectionNotes = tableInfo.sql.includes('reflection_notes');
|
|
372
|
+
if (!hasReflectionNotes) {
|
|
373
|
+
console.log('⚠️ FTS5 테이블에 reflection_notes 컬럼이 없음, Fallback 사용');
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
console.log('⚠️ reflection_notes 컬럼 확인 실패, Fallback 사용:', error);
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* reflection_notes 검색 쿼리 빌더
|
|
385
|
+
* 마이그레이션 상태에 따라 FTS5 MATCH 쿼리 또는 LIKE 쿼리를 선택합니다.
|
|
386
|
+
*
|
|
387
|
+
* @param db - 데이터베이스 인스턴스
|
|
388
|
+
* @param searchQuery - 검색 쿼리
|
|
389
|
+
* @returns reflection_notes 검색 조건 (SQL WHERE 절 조건)
|
|
390
|
+
*/
|
|
391
|
+
buildReflectionNotesSearchCondition(db, searchQuery) {
|
|
392
|
+
// reflection_notes 검색이 필요한지 확인 (쿼리에 reflection_notes 관련 키워드가 있는지)
|
|
393
|
+
// 간단한 구현: 모든 쿼리에 reflection_notes 검색 포함
|
|
394
|
+
// 향후 개선: 쿼리 분석하여 reflection_notes 검색 필요 여부 판단
|
|
395
|
+
const canUseFTS5 = this.checkReflectionNotesAvailability(db);
|
|
396
|
+
if (canUseFTS5) {
|
|
397
|
+
// FTS5 MATCH 쿼리 사용
|
|
398
|
+
// Note: FTS5 MATCH는 이미 메인 쿼리에서 처리되므로, 별도 조건 불필요
|
|
399
|
+
// reflection_notes는 FTS5 테이블의 컬럼이므로 자동으로 검색됨
|
|
400
|
+
return null; // FTS5 MATCH 쿼리에서는 별도 조건 불필요
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
// LIKE 쿼리 사용 (Fallback)
|
|
404
|
+
const likeQuery = `%${searchQuery}%`;
|
|
405
|
+
return `m.reflection_notes LIKE ?`;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* 사용자에게 검색 결과가 선택된 이유를 명확히 전달하여 검색 결과의 신뢰성을 높입니다.
|
|
410
|
+
* 관련성, 최근성, 중요도 등 다양한 요소를 종합하여 투명한 검색 과정을 제공합니다.
|
|
316
411
|
*/
|
|
317
412
|
generateRecallReason(relevance, recency, importance, finalScore, isFTS = false) {
|
|
318
413
|
const reasons = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AASnD,MAAM,OAAO,YAAY;IACf,OAAO,CAAgB;IAE/B;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,EAAO,EACP,KAAkB;QAElB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;QAE1D,+BAA+B;QAC/B,MAAM,WAAW,GAAG,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzD,IAAI,GAAW,CAAC;QAChB,MAAM,MAAM,GAAU,EAAE,CAAC;QAEzB,sCAAsC;QACtC,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,mBAAmB;YACnB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAE1D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;gBAEjD,mCAAmC;gBACnC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/C,GAAG,GAAG;;;;;;;WAOL,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,GAAG,GAAG;;;;;;;;;WASL,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,MAAM,SAAS,GAAG,IAAI,WAAW,GAAG,CAAC;gBACrC,GAAG,GAAG;;;;;;;;SAQL,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yCAAyC;YACzC,GAAG,GAAG;;;;;;;OAOL,CAAC;YAEF,wBAAwB;YACxB,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,MAAM,SAAS,GAAG,IAAI,WAAW,GAAG,CAAC;gBACrC,GAAG,IAAI,yBAAyB,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,cAAc;QACd,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,OAAO,EAAE,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,UAAU,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,UAAU,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1F,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB;QACzD,CAAC;QAED,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,aAAa;QACb,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,GAAG,IAAI,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,oBAAoB;QACpB,GAAG,IAAI,oDAAoD,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,6BAA6B;QAErD,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5C,6BAA6B;QAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAE9D,yBAAyB;QACzB,MAAM,YAAY,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnD,cAAc;QACd,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,UAAU;QAErE,OAAO;YACL,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,YAAY,CAAC,MAAM;YAChC,UAAU,EAAE,SAAS;SACtB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,KAAa;QACjC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;QAEvC,YAAY;QACZ,MAAM,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAEnD,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,CAAC,gCAAgC;QAC/C,CAAC;QAED,mBAAmB;QACnB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,SAAS,GAAG,CAAC,CAAC;QAEhD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,CAAC,gCAAgC;QAC/C,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,KAAa;QACnC,YAAY;QACZ,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAElD,kCAAkC;QAClC,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;QAEzD,eAAe;QACf,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAE3C,yBAAyB;QACzB,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAC/C,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CACtD,CAAC;QAEF,6BAA6B;QAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAa;QAC/B,oBAAoB;QACpB,OAAO,KAAK;aACT,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,YAAY;aACjC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAE,cAAc;aACnC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,mBAAmB;aAC9C,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW;aAChC,IAAI,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CAAC,EAAqB,EAAE,GAAW,EAAE,MAAiB;QAC9E,+BAA+B;QAC/B,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAc,EAAE,KAAa;QAChD,MAAM,gBAAgB,GAAa,EAAE,CAAC;QAEtC,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE;YAChB,iCAAiC;YACjC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;gBAC7B,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB;gBACtD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC9B,KAAK;oBACL,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBAC3C,CAAC,CAAC;YAEL,SAAS;YACT,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EACxB,GAAG,CAAC,IAAI,CACT,CAAC;YAEF,SAAS;YACT,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CACjD,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,IAAI,CACT,CAAC;YAEF,qBAAqB;YACrB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;gBACxC,SAAS,EAAE,CAAC,EAAE,MAAM;gBACpB,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YAEH,YAAY;YACZ,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,2BAA2B,CACjE,GAAG,CAAC,OAAO,EACX,gBAAgB,CACjB,CAAC;YAEF,yBAAyB;YACzB,MAAM,kBAAkB,GAAG,GAAG,CAAC,mBAAmB,KAAK,IAAI,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS;gBAClG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC;YAEd,WAAW;YACX,IAAI,UAAkB,CAAC;YAEvB,0CAA0C;YAC1C,IAAI,aAAa,CAAC,yBAAyB,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChF,wBAAwB;gBACxB,MAAM,gBAAgB,GAAG,SAAS,CAAC;gBACnC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,oCAAoC,CAC5D,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,CAAC,+BAA+B;iBAC3C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,cAAc;gBACd,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC;oBACxB,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;wBAC/C,SAAS,EAAE,GAAG;wBACd,OAAO;wBACP,UAAU;wBACV,KAAK;wBACL,mBAAmB,EAAE,kBAAkB;qBACxC,CAAC,GAAG,GAAG,CAAC,CAAC;oBACV,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;wBAC/B,SAAS;wBACT,OAAO;wBACP,UAAU;wBACV,KAAK;wBACL,mBAAmB,EAAE,kBAAkB;qBACxC,CAAC,CAAC;YACP,CAAC;YAED,uBAAuB;YACvB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAEnC,MAAM,MAAM,GAAQ;gBAClB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;gBAC1C,KAAK,EAAE,UAAU;gBACjB,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC;aAClG,CAAC;YAEF,wCAAwC;YACxC,IAAI,aAAa,CAAC,yBAAyB,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChF,MAAM,CAAC,mBAAmB,GAAG,kBAAkB,CAAC;YAClD,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;IACrD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,qBAAqB,CAAC,EAAO;QACzC,IAAI,CAAC;YACH,oBAAoB;YACpB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;OAGzB,CAAC,CAAC,GAAG,EAAE,CAAC;YAET,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,wBAAwB;YACxB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAE,CAAC;YAChF,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,cAAc;YACd,IAAI,CAAC;gBACH,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAC1B,SAAiB,EACjB,OAAe,EACf,UAAkB,EAClB,UAAkB,EAClB,QAAiB,KAAK;QAEtB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9D,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"search-engine.js","sourceRoot":"","sources":["../../src/algorithms/search-engine.ts"],"names":[],"mappings":"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"}
|