fix(festival-bot): 서술형 장소명 카카오맵 매칭 개선
Gemini가 추출한 서술형 장소명("캐리비안 베이 야외 파도풀 특설무대")이
카카오맵 검색에 안 걸려 좌표 없이 저장(장소 클릭 불가)되던 문제.
검색 실패 시 뒤 단어부터 줄이며 재시도하고, 축약 매칭 시 표시명은
원본 유지 + 좌표만 사용. 기존 2건(울산·캐리비안) 좌표 백필 완료.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
5c31977411
commit
680ea46cd5
1 changed files with 22 additions and 9 deletions
|
|
@ -93,19 +93,32 @@ async function festivalBotPlugin(fastify, opts) {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 카카오맵 장소 검색 (실패 시 이름만 가진 venue 반환)
|
* 카카오맵 장소 검색 (실패 시 이름만 가진 venue 반환)
|
||||||
|
* 서술형 장소명("캐리비안 베이 야외 파도풀 특설무대")은 검색이 안 되므로
|
||||||
|
* 뒤 단어부터 하나씩 줄이며 재시도. 축약 매칭 시 표시명은 원본을 유지하고 좌표만 사용.
|
||||||
*/
|
*/
|
||||||
async function resolveVenue(query) {
|
async function resolveVenue(query) {
|
||||||
let venue = query ? { name: query } : null;
|
if (!query) return null;
|
||||||
if (!query) return venue;
|
const fallback = { name: query };
|
||||||
try {
|
const words = query.trim().split(/\s+/);
|
||||||
const docs = await searchKakaoPlace(query);
|
for (let n = words.length; n >= 1; n--) {
|
||||||
if (docs.length > 0) {
|
const q = words.slice(0, n).join(' ');
|
||||||
venue = kakaoToVenue(docs[0]);
|
let docs;
|
||||||
|
try {
|
||||||
|
docs = await searchKakaoPlace(q);
|
||||||
|
} catch (err) {
|
||||||
|
fastify.log.warn(`[festival] 장소 검색 실패 (${q}): ${err.message}`);
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
if (docs.length > 0) {
|
||||||
|
const venue = kakaoToVenue(docs[0]);
|
||||||
|
if (n < words.length) {
|
||||||
|
venue.name = query; // 더 구체적인 원본 이름 유지
|
||||||
|
fastify.log.info(`[festival] 장소 축약 매칭: "${query}" → "${q}" (${docs[0].place_name})`);
|
||||||
|
}
|
||||||
|
return venue;
|
||||||
}
|
}
|
||||||
} catch (err) {
|
|
||||||
fastify.log.warn(`[festival] 장소 검색 실패 (${query}): ${err.message}`);
|
|
||||||
}
|
}
|
||||||
return venue;
|
return fallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue