korean-stats-mcp 1.4.0
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/LICENSE +21 -0
- package/README.md +301 -0
- package/dist/api/client.d.ts +65 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +143 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +157 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +5 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cache/index.d.ts +55 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +102 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config/index.d.ts +46 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +54 -0
- package/dist/config/index.js.map +1 -0
- package/dist/data/quickStatsParams.d.ts +76 -0
- package/dist/data/quickStatsParams.d.ts.map +1 -0
- package/dist/data/quickStatsParams.js +1344 -0
- package/dist/data/quickStatsParams.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +5 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/statisticsAssistant.d.ts +25 -0
- package/dist/prompts/statisticsAssistant.d.ts.map +1 -0
- package/dist/prompts/statisticsAssistant.js +43 -0
- package/dist/prompts/statisticsAssistant.js.map +1 -0
- package/dist/resources/categoryTree.d.ts +18 -0
- package/dist/resources/categoryTree.d.ts.map +1 -0
- package/dist/resources/categoryTree.js +80 -0
- package/dist/resources/categoryTree.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +6 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/keyIndicators.d.ts +20 -0
- package/dist/resources/keyIndicators.d.ts.map +1 -0
- package/dist/resources/keyIndicators.js +108 -0
- package/dist/resources/keyIndicators.js.map +1 -0
- package/dist/server-http.d.ts +10 -0
- package/dist/server-http.d.ts.map +1 -0
- package/dist/server-http.js +134 -0
- package/dist/server-http.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyzeTimeSeries.d.ts +70 -0
- package/dist/tools/analyzeTimeSeries.d.ts.map +1 -0
- package/dist/tools/analyzeTimeSeries.js +204 -0
- package/dist/tools/analyzeTimeSeries.js.map +1 -0
- package/dist/tools/chains.d.ts +197 -0
- package/dist/tools/chains.d.ts.map +1 -0
- package/dist/tools/chains.js +369 -0
- package/dist/tools/chains.js.map +1 -0
- package/dist/tools/compareStatistics.d.ts +62 -0
- package/dist/tools/compareStatistics.d.ts.map +1 -0
- package/dist/tools/compareStatistics.js +190 -0
- package/dist/tools/compareStatistics.js.map +1 -0
- package/dist/tools/fetchKosisExcel.d.ts +62 -0
- package/dist/tools/fetchKosisExcel.d.ts.map +1 -0
- package/dist/tools/fetchKosisExcel.js +366 -0
- package/dist/tools/fetchKosisExcel.js.map +1 -0
- package/dist/tools/getRecommendedStats.d.ts +41 -0
- package/dist/tools/getRecommendedStats.d.ts.map +1 -0
- package/dist/tools/getRecommendedStats.js +251 -0
- package/dist/tools/getRecommendedStats.js.map +1 -0
- package/dist/tools/getStatisticsData.d.ts +75 -0
- package/dist/tools/getStatisticsData.d.ts.map +1 -0
- package/dist/tools/getStatisticsData.js +305 -0
- package/dist/tools/getStatisticsData.js.map +1 -0
- package/dist/tools/getStatisticsList.d.ts +69 -0
- package/dist/tools/getStatisticsList.d.ts.map +1 -0
- package/dist/tools/getStatisticsList.js +336 -0
- package/dist/tools/getStatisticsList.js.map +1 -0
- package/dist/tools/getTableInfo.d.ts +66 -0
- package/dist/tools/getTableInfo.d.ts.map +1 -0
- package/dist/tools/getTableInfo.js +85 -0
- package/dist/tools/getTableInfo.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +19 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/quickStats.d.ts +71 -0
- package/dist/tools/quickStats.d.ts.map +1 -0
- package/dist/tools/quickStats.js +490 -0
- package/dist/tools/quickStats.js.map +1 -0
- package/dist/tools/quickTrend.d.ts +61 -0
- package/dist/tools/quickTrend.d.ts.map +1 -0
- package/dist/tools/quickTrend.js +328 -0
- package/dist/tools/quickTrend.js.map +1 -0
- package/dist/tools/searchStatistics.d.ts +41 -0
- package/dist/tools/searchStatistics.d.ts.map +1 -0
- package/dist/tools/searchStatistics.js +318 -0
- package/dist/tools/searchStatistics.js.map +1 -0
- package/dist/utils/dataFormatter.d.ts +40 -0
- package/dist/utils/dataFormatter.d.ts.map +1 -0
- package/dist/utils/dataFormatter.js +142 -0
- package/dist/utils/dataFormatter.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +33 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +94 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/metaLookup.d.ts +93 -0
- package/dist/utils/metaLookup.d.ts.map +1 -0
- package/dist/utils/metaLookup.js +170 -0
- package/dist/utils/metaLookup.js.map +1 -0
- package/dist/utils/queryParser.d.ts +45 -0
- package/dist/utils/queryParser.d.ts.map +1 -0
- package/dist/utils/queryParser.js +244 -0
- package/dist/utils/queryParser.js.map +1 -0
- package/dist/utils/regions.d.ts +70 -0
- package/dist/utils/regions.d.ts.map +1 -0
- package/dist/utils/regions.js +261 -0
- package/dist/utils/regions.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 통계 검색 도구
|
|
3
|
+
* 키워드로 KOSIS 통계표를 검색
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { getKosisClient } from '../api/client.js';
|
|
7
|
+
import { getCacheManager } from '../cache/index.js';
|
|
8
|
+
import { parseQuery, generateSearchTerms, REGION_NAMES } from '../utils/queryParser.js';
|
|
9
|
+
import { detectRegion, isProvinceBaseStat } from '../utils/regions.js';
|
|
10
|
+
/**
|
|
11
|
+
* 키워드별 우선 표시 테이블 ID
|
|
12
|
+
* - 검색 결과에서 이 테이블들이 있으면 상위로 배치
|
|
13
|
+
* - 일반 사용자가 가장 기대하는 결과를 먼저 보여주기 위함
|
|
14
|
+
*/
|
|
15
|
+
const PRIORITY_TABLES = {
|
|
16
|
+
// 인구 관련
|
|
17
|
+
'인구': ['DT_1B04005', 'DT_1IN1503', 'DT_1YL20001', 'DT_1B8000F'],
|
|
18
|
+
'인구수': ['DT_1B04005', 'DT_1IN1503'],
|
|
19
|
+
'총인구': ['DT_1B04005', 'DT_1IN1503', 'DT_1YL20001'],
|
|
20
|
+
'주민등록인구': ['DT_1B04005', 'DT_1IN1503'],
|
|
21
|
+
'인구현황': ['DT_1B04005', 'DT_1IN1503'],
|
|
22
|
+
// 주거/부동산 관련
|
|
23
|
+
'집값': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
24
|
+
'주택가격': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
25
|
+
'아파트': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
26
|
+
'아파트가격': ['DT_1YL21101'],
|
|
27
|
+
'전세': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
28
|
+
'매매': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
29
|
+
'부동산': ['DT_1YL21101', 'DT_1YL20111E'],
|
|
30
|
+
// 고용 관련
|
|
31
|
+
'실업률': ['DT_1DA7102S', 'DT_1DA7001'],
|
|
32
|
+
'실업': ['DT_1DA7102S', 'DT_1DA7001'],
|
|
33
|
+
'취업': ['DT_1DA7001', 'DT_1DA7012'],
|
|
34
|
+
'고용률': ['DT_1DA7001', 'DT_1DA7012'],
|
|
35
|
+
// 경제 관련
|
|
36
|
+
'GDP': ['DT_2AS004', 'DT_2AS003'],
|
|
37
|
+
'국내총생산': ['DT_2AS004', 'DT_2AS003'],
|
|
38
|
+
'경제성장': ['DT_2AS004', 'DT_2AS003'],
|
|
39
|
+
'물가': ['DT_1J22001', 'DT_1J20001'],
|
|
40
|
+
'소비자물가': ['DT_1J22001', 'DT_1J20001'],
|
|
41
|
+
// 출산/사망 관련
|
|
42
|
+
'출산율': ['DT_1B81A17', 'DT_1B8000H'],
|
|
43
|
+
'합계출산율': ['DT_1B81A17'],
|
|
44
|
+
'출생': ['DT_1B8000H', 'DT_1B8000F'],
|
|
45
|
+
'사망': ['DT_1B8000H', 'DT_1B8000F'],
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* 검색어 동의어 사전
|
|
49
|
+
* - 다양한 표현을 표준 검색어로 통일
|
|
50
|
+
*/
|
|
51
|
+
const SYNONYMS = {
|
|
52
|
+
'인구': ['인구수', '총인구', '주민등록인구', '인구현황', '인구통계'],
|
|
53
|
+
'집값': ['주택가격', '아파트값', '부동산가격', '집가격', '아파트가격'],
|
|
54
|
+
'월급': ['임금', '급여', '소득', '평균임금', '월소득'],
|
|
55
|
+
'실업률': ['실업', '실업자', '실업자수'],
|
|
56
|
+
'물가': ['소비자물가', '물가지수', 'CPI'],
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* 검색 결과에 우선 테이블이 없을 때 직접 삽입할 폴백 테이블
|
|
60
|
+
* - KOSIS API 검색이 핵심 통계를 반환하지 않을 때 사용
|
|
61
|
+
*/
|
|
62
|
+
const FALLBACK_TABLES = {
|
|
63
|
+
'인구': [
|
|
64
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B04005', TBL_NM: '시도/성/연령별 주민등록인구', STAT_ID: 'DT_1B04005', STAT_NM: '주민등록인구현황', VW_CD: 'MT_ZTITLE' },
|
|
65
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1IN1503', TBL_NM: '주민등록인구현황(시군구)', STAT_ID: 'DT_1IN1503', STAT_NM: '주민등록인구현황', VW_CD: 'MT_ZTITLE' },
|
|
66
|
+
],
|
|
67
|
+
'집값': [
|
|
68
|
+
{ ORG_ID: '116', ORG_NM: '한국부동산원', TBL_ID: 'DT_1YL21101', TBL_NM: '아파트 매매/전세 가격지수', STAT_ID: 'DT_1YL21101', STAT_NM: '부동산통계', VW_CD: 'MT_ZTITLE' },
|
|
69
|
+
{ ORG_ID: '116', ORG_NM: '한국부동산원', TBL_ID: 'DT_1YL20111E', TBL_NM: '주택매매가격지수', STAT_ID: 'DT_1YL20111E', STAT_NM: '부동산통계', VW_CD: 'MT_ZTITLE' },
|
|
70
|
+
],
|
|
71
|
+
'실업률': [
|
|
72
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1DA7102S', TBL_NM: '성/연령별 실업률', STAT_ID: 'DT_1DA7102S', STAT_NM: '경제활동인구조사', VW_CD: 'MT_ZTITLE' },
|
|
73
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1DA7001', TBL_NM: '경제활동인구총괄', STAT_ID: 'DT_1DA7001', STAT_NM: '경제활동인구조사', VW_CD: 'MT_ZTITLE' },
|
|
74
|
+
],
|
|
75
|
+
'GDP': [
|
|
76
|
+
{ ORG_ID: '301', ORG_NM: '한국은행', TBL_ID: 'DT_200Y001', TBL_NM: '국내총생산(GDP)', STAT_ID: 'DT_200Y001', STAT_NM: '국민계정', VW_CD: 'MT_OTITLE' },
|
|
77
|
+
{ ORG_ID: '301', ORG_NM: '한국은행', TBL_ID: 'DT_2AS004', TBL_NM: '경제성장률', STAT_ID: 'DT_2AS004', STAT_NM: '국민계정', VW_CD: 'MT_OTITLE' },
|
|
78
|
+
],
|
|
79
|
+
'물가': [
|
|
80
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1J22001', TBL_NM: '소비자물가 등락률', STAT_ID: 'DT_1J22001', STAT_NM: '소비자물가조사', VW_CD: 'MT_ZTITLE' },
|
|
81
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1J20001', TBL_NM: '소비자물가지수', STAT_ID: 'DT_1J20001', STAT_NM: '소비자물가조사', VW_CD: 'MT_ZTITLE' },
|
|
82
|
+
],
|
|
83
|
+
'출산율': [
|
|
84
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B81A17', TBL_NM: '합계출산율', STAT_ID: 'DT_1B81A17', STAT_NM: '인구동향조사', VW_CD: 'MT_ZTITLE' },
|
|
85
|
+
{ ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B8000H', TBL_NM: '인구동태건수(출생/사망)', STAT_ID: 'DT_1B8000H', STAT_NM: '인구동향조사', VW_CD: 'MT_ZTITLE' },
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
export const searchStatisticsSchema = {
|
|
89
|
+
name: 'search_statistics',
|
|
90
|
+
description: '[검색] 키워드로 KOSIS 통계표 검색 → orgId/tableId 메타 획득 (직접 데이터 조회 전 단계). 자치구·시군은 광역시도 기본통계 시리즈로 자동 라우팅(Path A/B/C). 단일 수치/추세는 quick_stats / quick_trend가 더 빠름. 분야는 알지만 통계표를 모르면 get_statistics_list(recommendedTopic).',
|
|
91
|
+
inputSchema: z.object({
|
|
92
|
+
query: z
|
|
93
|
+
.string()
|
|
94
|
+
.describe('검색어 (예: 인구, 경제성장률, 출생률, 서울 실업률)'),
|
|
95
|
+
orgId: z
|
|
96
|
+
.string()
|
|
97
|
+
.optional()
|
|
98
|
+
.describe('기관코드 (선택, 예: 101=통계청)'),
|
|
99
|
+
sort: z
|
|
100
|
+
.enum(['RANK', 'DATE'])
|
|
101
|
+
.optional()
|
|
102
|
+
.default('RANK')
|
|
103
|
+
.describe('정렬: RANK(정확도순), DATE(최신순)'),
|
|
104
|
+
limit: z
|
|
105
|
+
.number()
|
|
106
|
+
.min(1)
|
|
107
|
+
.max(50)
|
|
108
|
+
.optional()
|
|
109
|
+
.default(10)
|
|
110
|
+
.describe('결과 개수 (기본: 10, 최대: 50)'),
|
|
111
|
+
}),
|
|
112
|
+
};
|
|
113
|
+
export async function searchStatistics(input) {
|
|
114
|
+
const client = getKosisClient();
|
|
115
|
+
const cache = getCacheManager();
|
|
116
|
+
// 쿼리 분석
|
|
117
|
+
const parsed = parseQuery(input.query);
|
|
118
|
+
const searchTerms = generateSearchTerms(parsed, input.query);
|
|
119
|
+
// 지역명 추출 (결과 필터링용)
|
|
120
|
+
const regionNames = parsed.regions.map(code => REGION_NAMES[code]).filter(Boolean);
|
|
121
|
+
const hasRegion = regionNames.length > 0;
|
|
122
|
+
// 자치구·시·군 감지 → 「OO광역시도 기본통계」시리즈 라우팅
|
|
123
|
+
const detected = detectRegion(input.query);
|
|
124
|
+
const districtName = detected.district;
|
|
125
|
+
const provinceOrgId = detected.province?.orgId;
|
|
126
|
+
// 명시적 orgId 우선, 없으면 자치구 감지 결과 활용
|
|
127
|
+
const effectiveOrgId = input.orgId ?? provinceOrgId;
|
|
128
|
+
// 검색어 결정 - 지역이 있으면 조합 검색어 우선, 없으면 원본 쿼리
|
|
129
|
+
const searchWord = searchTerms.length > 0 ? searchTerms[0] : input.query;
|
|
130
|
+
try {
|
|
131
|
+
// 캐시된 검색 결과 조회
|
|
132
|
+
let results = await cache.getSearchResults({ query: searchWord, orgId: effectiveOrgId, sort: input.sort }, async () => {
|
|
133
|
+
return client.searchStatistics(searchWord, {
|
|
134
|
+
orgId: effectiveOrgId,
|
|
135
|
+
sort: input.sort,
|
|
136
|
+
startCount: 1,
|
|
137
|
+
resultCount: input.limit ? input.limit * 2 : 20, // 지역 필터링을 위해 더 많이 조회
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
// 검색 결과 후처리 - 우선 테이블 상위 배치
|
|
141
|
+
// 1. 검색어에서 우선 테이블 ID 추출
|
|
142
|
+
const priorityTableIds = getPriorityTableIds(input.query);
|
|
143
|
+
// 2. 검색 결과에 우선 테이블이 없으면 폴백 테이블 삽입
|
|
144
|
+
const existingTableIds = new Set(results.map(r => r.TBL_ID));
|
|
145
|
+
const hasPriorityTable = priorityTableIds.some(id => existingTableIds.has(id));
|
|
146
|
+
if (!hasPriorityTable) {
|
|
147
|
+
// 폴백 테이블 가져오기
|
|
148
|
+
const fallbackTables = getFallbackTables(input.query);
|
|
149
|
+
if (fallbackTables.length > 0) {
|
|
150
|
+
// 폴백 테이블을 맨 앞에 추가 (중복 제거)
|
|
151
|
+
const newTables = fallbackTables.filter(t => !existingTableIds.has(t.TBL_ID));
|
|
152
|
+
results = [...newTables, ...results];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (results.length > 0) {
|
|
156
|
+
// 3. 결과 정렬 - 우선 테이블과 지역명 고려
|
|
157
|
+
results = results.sort((a, b) => {
|
|
158
|
+
// 자치구 감지 시: 해당 광역시도 「기본통계」 시리즈 (DT_2xx004_*) 최우선
|
|
159
|
+
if (districtName && provinceOrgId) {
|
|
160
|
+
const aIsBase = isProvinceBaseStat(a.ORG_ID, a.TBL_ID) != null;
|
|
161
|
+
const bIsBase = isProvinceBaseStat(b.ORG_ID, b.TBL_ID) != null;
|
|
162
|
+
if (aIsBase && !bIsBase)
|
|
163
|
+
return -1;
|
|
164
|
+
if (!aIsBase && bIsBase)
|
|
165
|
+
return 1;
|
|
166
|
+
}
|
|
167
|
+
// 우선 테이블 점수 계산 (낮을수록 우선)
|
|
168
|
+
const aPriority = getPriorityScore(a.TBL_ID, priorityTableIds);
|
|
169
|
+
const bPriority = getPriorityScore(b.TBL_ID, priorityTableIds);
|
|
170
|
+
// 우선 테이블 점수가 다르면 그걸로 정렬
|
|
171
|
+
if (aPriority !== bPriority) {
|
|
172
|
+
return aPriority - bPriority;
|
|
173
|
+
}
|
|
174
|
+
// 지역이 있는 경우 지역명 포함 여부로 2차 정렬
|
|
175
|
+
if (hasRegion) {
|
|
176
|
+
const aHasRegion = regionNames.some(region => (a.TBL_NM || '').includes(region) ||
|
|
177
|
+
(a.STAT_NM || '').includes(region));
|
|
178
|
+
const bHasRegion = regionNames.some(region => (b.TBL_NM || '').includes(region) ||
|
|
179
|
+
(b.STAT_NM || '').includes(region));
|
|
180
|
+
if (aHasRegion && !bHasRegion)
|
|
181
|
+
return -1;
|
|
182
|
+
if (!aHasRegion && bHasRegion)
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
// 테이블명에 검색 키워드가 직접 포함된 경우 우선
|
|
186
|
+
const queryKeywords = input.query.split(/\s+/).filter(k => k.length > 1);
|
|
187
|
+
const aHasKeyword = queryKeywords.some(k => (a.TBL_NM || '').includes(k));
|
|
188
|
+
const bHasKeyword = queryKeywords.some(k => (b.TBL_NM || '').includes(k));
|
|
189
|
+
if (aHasKeyword && !bHasKeyword)
|
|
190
|
+
return -1;
|
|
191
|
+
if (!aHasKeyword && bHasKeyword)
|
|
192
|
+
return 1;
|
|
193
|
+
return 0;
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
// 결과 개수 제한 (정렬 후 상위 N개만)
|
|
197
|
+
const limitedResults = results.slice(0, input.limit || 10);
|
|
198
|
+
// 결과 간소화
|
|
199
|
+
// API 응답 필드: ORG_ID, ORG_NM, TBL_ID, TBL_NM, STAT_NM, STRT_PRD_DE, END_PRD_DE, VW_CD 등
|
|
200
|
+
const simplifiedResults = limitedResults.map((item) => ({
|
|
201
|
+
orgId: item.ORG_ID,
|
|
202
|
+
orgName: item.ORG_NM,
|
|
203
|
+
tableId: item.TBL_ID,
|
|
204
|
+
tableName: item.TBL_NM,
|
|
205
|
+
statisticsName: item.STAT_NM,
|
|
206
|
+
period: item.STRT_PRD_DE && item.END_PRD_DE
|
|
207
|
+
? `${item.STRT_PRD_DE}~${item.END_PRD_DE}`
|
|
208
|
+
: item.STRT_PRD_DE || item.END_PRD_DE || '',
|
|
209
|
+
periodType: item.VW_CD || '',
|
|
210
|
+
lastUpdated: item.END_PRD_DE,
|
|
211
|
+
}));
|
|
212
|
+
// 후속 질문 제안
|
|
213
|
+
const suggestions = [];
|
|
214
|
+
if (simplifiedResults.length > 0) {
|
|
215
|
+
const firstResult = simplifiedResults[0];
|
|
216
|
+
if (districtName) {
|
|
217
|
+
suggestions.push(`"${firstResult.tableName}"에서 ${districtName} 데이터 조회 (regionName="${districtName}")`);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
suggestions.push(`"${firstResult.tableName}"의 최근 데이터 조회`, `${firstResult.orgName}의 다른 통계 검색`);
|
|
221
|
+
}
|
|
222
|
+
if (parsed.regions.length === 0 && !districtName) {
|
|
223
|
+
suggestions.push('서울, 부산 등 지역별 데이터 비교');
|
|
224
|
+
}
|
|
225
|
+
if (!parsed.timeRange) {
|
|
226
|
+
suggestions.push('최근 5년 추세 분석');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
success: true,
|
|
231
|
+
totalCount: simplifiedResults.length,
|
|
232
|
+
results: simplifiedResults,
|
|
233
|
+
queryAnalysis: {
|
|
234
|
+
topics: parsed.topics,
|
|
235
|
+
regions: parsed.regions,
|
|
236
|
+
intent: parsed.intent,
|
|
237
|
+
district: districtName,
|
|
238
|
+
province: detected.province?.fullName,
|
|
239
|
+
},
|
|
240
|
+
suggestions,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
console.error('Search error:', error);
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
totalCount: 0,
|
|
248
|
+
results: [],
|
|
249
|
+
queryAnalysis: {
|
|
250
|
+
topics: parsed.topics,
|
|
251
|
+
regions: parsed.regions,
|
|
252
|
+
intent: parsed.intent,
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* 검색어에서 우선 배치해야 할 테이블 ID 목록 추출
|
|
259
|
+
*/
|
|
260
|
+
function getPriorityTableIds(query) {
|
|
261
|
+
const tableIds = [];
|
|
262
|
+
// 1. 직접 매칭되는 키워드 확인
|
|
263
|
+
for (const [keyword, ids] of Object.entries(PRIORITY_TABLES)) {
|
|
264
|
+
if (query.includes(keyword)) {
|
|
265
|
+
tableIds.push(...ids);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// 2. 동의어 확인
|
|
269
|
+
for (const [standard, synonyms] of Object.entries(SYNONYMS)) {
|
|
270
|
+
if (synonyms.some(syn => query.includes(syn))) {
|
|
271
|
+
// 동의어가 매칭되면 표준 키워드의 우선 테이블 추가
|
|
272
|
+
if (PRIORITY_TABLES[standard]) {
|
|
273
|
+
tableIds.push(...PRIORITY_TABLES[standard]);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// 중복 제거
|
|
278
|
+
return [...new Set(tableIds)];
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* 테이블 ID의 우선순위 점수 계산
|
|
282
|
+
* - 우선 목록에 있으면 순서대로 낮은 점수 (0, 1, 2...)
|
|
283
|
+
* - 없으면 높은 점수 (1000)
|
|
284
|
+
*/
|
|
285
|
+
function getPriorityScore(tableId, priorityTableIds) {
|
|
286
|
+
const index = priorityTableIds.indexOf(tableId);
|
|
287
|
+
return index >= 0 ? index : 1000;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 검색어에 해당하는 폴백 테이블 가져오기
|
|
291
|
+
* - 직접 매칭 및 동의어 매칭 지원
|
|
292
|
+
*/
|
|
293
|
+
function getFallbackTables(query) {
|
|
294
|
+
const tables = [];
|
|
295
|
+
// 1. 직접 매칭
|
|
296
|
+
for (const [keyword, fallbacks] of Object.entries(FALLBACK_TABLES)) {
|
|
297
|
+
if (query.includes(keyword)) {
|
|
298
|
+
tables.push(...fallbacks);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// 2. 동의어 매칭
|
|
302
|
+
for (const [standard, synonyms] of Object.entries(SYNONYMS)) {
|
|
303
|
+
if (synonyms.some(syn => query.includes(syn))) {
|
|
304
|
+
if (FALLBACK_TABLES[standard]) {
|
|
305
|
+
tables.push(...FALLBACK_TABLES[standard]);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// 중복 제거
|
|
310
|
+
const seen = new Set();
|
|
311
|
+
return tables.filter(t => {
|
|
312
|
+
if (seen.has(t.TBL_ID))
|
|
313
|
+
return false;
|
|
314
|
+
seen.add(t.TBL_ID);
|
|
315
|
+
return true;
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=searchStatistics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"searchStatistics.js","sourceRoot":"","sources":["../../src/tools/searchStatistics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 데이터 포매팅 유틸리티
|
|
3
|
+
*/
|
|
4
|
+
import type { StatisticsDataItem, SimplifiedDataItem } from '../api/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* 통계 데이터 간소화
|
|
7
|
+
*/
|
|
8
|
+
export declare function simplifyStatisticsData(items: StatisticsDataItem[]): SimplifiedDataItem[];
|
|
9
|
+
/**
|
|
10
|
+
* 시점 포매팅
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatPeriod(period: string, periodType: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* 숫자 포매팅
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatNumber(value: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* 변화율 계산
|
|
19
|
+
*/
|
|
20
|
+
export declare function calculateChangeRate(current: number, previous: number): {
|
|
21
|
+
rate: number;
|
|
22
|
+
direction: 'up' | 'down' | 'stable';
|
|
23
|
+
formatted: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* 추세 분석
|
|
27
|
+
*/
|
|
28
|
+
export declare function analyzeTrend(values: number[]): {
|
|
29
|
+
trend: 'increasing' | 'decreasing' | 'stable' | 'fluctuating';
|
|
30
|
+
avgGrowthRate: number;
|
|
31
|
+
volatility: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* 시각화 타입 추천
|
|
35
|
+
*/
|
|
36
|
+
export declare function recommendVisualization(dataLength: number, hasMultipleCategories: boolean, isTimeSeries: boolean): {
|
|
37
|
+
type: 'bar' | 'line' | 'pie' | 'table';
|
|
38
|
+
reason: string;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=dataFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/dataFormatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,kBAAkB,EAAE,GAC1B,kBAAkB,EAAE,CAQtB;AAkBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAevE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,CAWA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EAAE,GACf;IACD,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAuCA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,OAAO,EAC9B,YAAY,EAAE,OAAO,GACpB;IACD,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB,CA0BA"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 데이터 포매팅 유틸리티
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 통계 데이터 간소화
|
|
6
|
+
*/
|
|
7
|
+
export function simplifyStatisticsData(items) {
|
|
8
|
+
return items.map((item) => ({
|
|
9
|
+
period: formatPeriod(item.PRD_DE, item.PRD_SE),
|
|
10
|
+
value: formatNumber(item.DT),
|
|
11
|
+
classification: getClassificationName(item),
|
|
12
|
+
item: item.ITM_NM,
|
|
13
|
+
unit: item.UNIT_NM,
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 분류명 추출
|
|
18
|
+
*/
|
|
19
|
+
function getClassificationName(item) {
|
|
20
|
+
const names = [];
|
|
21
|
+
for (let i = 1; i <= 8; i++) {
|
|
22
|
+
const name = item[`C${i}_NM`];
|
|
23
|
+
if (name) {
|
|
24
|
+
names.push(name);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return names.join(' > ') || '-';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 시점 포매팅
|
|
31
|
+
*/
|
|
32
|
+
export function formatPeriod(period, periodType) {
|
|
33
|
+
if (!period)
|
|
34
|
+
return '-';
|
|
35
|
+
switch (periodType) {
|
|
36
|
+
case 'Y':
|
|
37
|
+
return `${period}년`;
|
|
38
|
+
case 'Q':
|
|
39
|
+
return `${period.slice(0, 4)}년 ${period.slice(4)}분기`;
|
|
40
|
+
case 'M':
|
|
41
|
+
return `${period.slice(0, 4)}년 ${parseInt(period.slice(4), 10)}월`;
|
|
42
|
+
case 'D':
|
|
43
|
+
return `${period.slice(0, 4)}.${period.slice(4, 6)}.${period.slice(6)}`;
|
|
44
|
+
default:
|
|
45
|
+
return period;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 숫자 포매팅
|
|
50
|
+
*/
|
|
51
|
+
export function formatNumber(value) {
|
|
52
|
+
if (!value || value === '-' || value === '...')
|
|
53
|
+
return value;
|
|
54
|
+
// 숫자가 아닌 경우 그대로 반환
|
|
55
|
+
const num = parseFloat(value.replace(/,/g, ''));
|
|
56
|
+
if (isNaN(num))
|
|
57
|
+
return value;
|
|
58
|
+
// 천 단위 구분자 추가
|
|
59
|
+
return num.toLocaleString('ko-KR', {
|
|
60
|
+
maximumFractionDigits: 2,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 변화율 계산
|
|
65
|
+
*/
|
|
66
|
+
export function calculateChangeRate(current, previous) {
|
|
67
|
+
if (previous === 0) {
|
|
68
|
+
return { rate: 0, direction: 'stable', formatted: '-' };
|
|
69
|
+
}
|
|
70
|
+
const rate = ((current - previous) / Math.abs(previous)) * 100;
|
|
71
|
+
const direction = rate > 0.1 ? 'up' : rate < -0.1 ? 'down' : 'stable';
|
|
72
|
+
const sign = rate > 0 ? '+' : '';
|
|
73
|
+
const formatted = `${sign}${rate.toFixed(1)}%`;
|
|
74
|
+
return { rate, direction, formatted };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 추세 분석
|
|
78
|
+
*/
|
|
79
|
+
export function analyzeTrend(values) {
|
|
80
|
+
if (values.length < 2) {
|
|
81
|
+
return { trend: 'stable', avgGrowthRate: 0, volatility: 0 };
|
|
82
|
+
}
|
|
83
|
+
// 변화율 계산
|
|
84
|
+
const changes = [];
|
|
85
|
+
for (let i = 1; i < values.length; i++) {
|
|
86
|
+
if (values[i - 1] !== 0) {
|
|
87
|
+
changes.push((values[i] - values[i - 1]) / Math.abs(values[i - 1]) * 100);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (changes.length === 0) {
|
|
91
|
+
return { trend: 'stable', avgGrowthRate: 0, volatility: 0 };
|
|
92
|
+
}
|
|
93
|
+
// 평균 변화율
|
|
94
|
+
const avgGrowthRate = changes.reduce((a, b) => a + b, 0) / changes.length;
|
|
95
|
+
// 변동성 (표준편차)
|
|
96
|
+
const variance = changes.reduce((sum, val) => sum + Math.pow(val - avgGrowthRate, 2), 0) /
|
|
97
|
+
changes.length;
|
|
98
|
+
const volatility = Math.sqrt(variance);
|
|
99
|
+
// 추세 판단
|
|
100
|
+
let trend;
|
|
101
|
+
if (volatility > 20) {
|
|
102
|
+
trend = 'fluctuating';
|
|
103
|
+
}
|
|
104
|
+
else if (avgGrowthRate > 2) {
|
|
105
|
+
trend = 'increasing';
|
|
106
|
+
}
|
|
107
|
+
else if (avgGrowthRate < -2) {
|
|
108
|
+
trend = 'decreasing';
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
trend = 'stable';
|
|
112
|
+
}
|
|
113
|
+
return { trend, avgGrowthRate, volatility };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 시각화 타입 추천
|
|
117
|
+
*/
|
|
118
|
+
export function recommendVisualization(dataLength, hasMultipleCategories, isTimeSeries) {
|
|
119
|
+
if (isTimeSeries && dataLength > 2) {
|
|
120
|
+
return {
|
|
121
|
+
type: 'line',
|
|
122
|
+
reason: '시계열 데이터는 선 그래프로 추세를 파악하기 좋습니다.',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
if (hasMultipleCategories && dataLength <= 6) {
|
|
126
|
+
return {
|
|
127
|
+
type: 'pie',
|
|
128
|
+
reason: '비율 비교는 파이 차트가 적합합니다.',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (dataLength <= 10) {
|
|
132
|
+
return {
|
|
133
|
+
type: 'bar',
|
|
134
|
+
reason: '항목 비교는 막대 그래프가 효과적입니다.',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
type: 'table',
|
|
139
|
+
reason: '데이터가 많아 표 형식이 가장 적합합니다.',
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=dataFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataFormatter.js","sourceRoot":"","sources":["../../src/utils/dataFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 에러 처리 유틸리티
|
|
3
|
+
*/
|
|
4
|
+
export declare enum ErrorCode {
|
|
5
|
+
INVALID_API_KEY = "INVALID_API_KEY",
|
|
6
|
+
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED",
|
|
7
|
+
INVALID_PARAMETER = "INVALID_PARAMETER",
|
|
8
|
+
NO_DATA_FOUND = "NO_DATA_FOUND",
|
|
9
|
+
API_UNAVAILABLE = "API_UNAVAILABLE",
|
|
10
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
11
|
+
UNKNOWN_ERROR = "UNKNOWN_ERROR"
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 사용자 친화적 에러 메시지 반환
|
|
15
|
+
*/
|
|
16
|
+
export declare function getErrorMessage(code: ErrorCode | string): string;
|
|
17
|
+
/**
|
|
18
|
+
* 에러를 안전하게 처리하고 결과 반환
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleToolError(error: unknown): {
|
|
21
|
+
success: false;
|
|
22
|
+
error: string;
|
|
23
|
+
code: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* 재시도 래퍼 함수
|
|
27
|
+
*/
|
|
28
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: {
|
|
29
|
+
maxRetries?: number;
|
|
30
|
+
baseDelay?: number;
|
|
31
|
+
maxDelay?: number;
|
|
32
|
+
}): Promise<T>;
|
|
33
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,SAAS;IACnB,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAChC;AAmBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/C,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CA0BA;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
|