My jekyll blog search logic report
Jekyll ๋ธ๋ก๊ทธ ๊ฒ์ ๊ธฐ๋ฅ ๋ถ์ ๋ณด๊ณ ์
๐ ๊ฐ์
๋ณธ ๋ณด๊ณ ์๋ Jekyll ๊ธฐ๋ฐ ๋ธ๋ก๊ทธ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ฒ์ ๊ธฐ๋ฅ์ ๋ํ ์์ธ ๋ถ์์ ์ ๊ณตํฉ๋๋ค. ํ์ฌ ๊ตฌํ๋ ๊ฒ์ ์์คํ ์ ์๋ ์๋ฆฌ, ๊ฒ์ ๊ธฐ์ค, ๊ทธ๋ฆฌ๊ณ ํฅํ ๊ฐ์ ๋ฐฉ์์ ๋ํด ๋ค๋ฃน๋๋ค.
๐ ๊ฒ์ ๊ธฐ๋ฅ ํํฉ
๊ฒ์ ๋์ ๋ฐ์ดํฐ
ํ์ฌ ๊ฒ์ ์์คํ ์ Jekyll์ Liquid ํ ํ๋ฆฟ์ ํตํด ์์ฑ๋ 4๊ฐ์ง ๋ฐ์ดํฐ ์์ฑ์ ๋์์ผ๋ก ํฉ๋๋ค:
๊ฒ์ ๋์ | ๋ฐ์ดํฐ ์์ฑ | ์์ค | ์ ์ฒ๋ฆฌ ๊ณผ์ |
---|---|---|---|
ํฌ์คํธ ์ ๋ชฉ | data-title |
post.title |
์๋ฌธ์ ๋ณํ, ๊ณต๋ฐฑ ์ ๊ฑฐ, HTML ์ด์ค์ผ์ดํ |
ํฌ์คํธ ๋ด์ฉ | data-content |
post.excerpt |
HTML ํ๊ทธ ์ ๊ฑฐ, ์ค๋ฐ๊ฟ ์ ๊ฑฐ, ์๋ฌธ์ ๋ณํ |
ํ๊ทธ | data-tags |
post.tags |
๊ณต๋ฐฑ์ผ๋ก ์ฐ๊ฒฐ, ์๋ฌธ์ ๋ณํ |
์นดํ ๊ณ ๋ฆฌ | data-categories |
post.categories |
๊ณต๋ฐฑ์ผ๋ก ์ฐ๊ฒฐ, ์๋ฌธ์ ๋ณํ |
๊ฒ์ ์๊ณ ๋ฆฌ์ฆ
// ๊ฒ์ ๋ก์ง (OR ์กฐ๊ฑด)
const isMatch = title.includes(searchTerm) ||
content.includes(searchTerm) ||
tags.includes(searchTerm) ||
categories.includes(searchTerm);
ํน์ง:
- ๋ถ๋ถ ๋ฌธ์์ด ๋งค์นญ:
String.includes()
๋ฉ์๋ ์ฌ์ฉ - OR ์กฐ๊ฑด: 4๊ฐ ์์ญ ์ค ํ๋๋ผ๋ ์ผ์นํ๋ฉด ๊ฒฐ๊ณผ์ ํฌํจ
- ๋์๋ฌธ์ ๋ฌด์: ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์๋ฌธ์๋ก ์ ๊ทํ
- ์ค์๊ฐ ๊ฒ์: 300ms ๋๋ฐ์ด์ฑ ์ ์ฉ
๐ ๊ฒ์ ์ฑ๋ฅ ๋ถ์
์ฅ์
โ ๋น ๋ฅธ ์๋ต ์๋
- ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ฒ์์ผ๋ก ์๋ฒ ์์ฒญ ์์
- ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ก ์ฆ์ ๊ฒฐ๊ณผ ์ ๊ณต
โ ์ฌ์ฉ์ ์นํ์ ์ธํฐํ์ด์ค
- ์ค์๊ฐ ๊ฒ์ ๊ฒฐ๊ณผ ์ ๋ฐ์ดํธ
- ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์ ํ์
- ๊ฒ์์ด ์ง์ฐ๊ธฐ ๊ธฐ๋ฅ
โ ๋ค์ํ ๊ฒ์ ๋ฒ์
- ์ ๋ชฉ, ๋ด์ฉ, ํ๊ทธ, ์นดํ ๊ณ ๋ฆฌ ํตํฉ ๊ฒ์
- ๋ถ๋ถ ๋งค์นญ์ผ๋ก ๋์ ๊ฒ์ ์ ํ๋
์ ํ์ฌํญ
โ ๊ฒ์ ๋ฒ์ ์ ํ
- ์ ์ฒด ํฌ์คํธ ๋ด์ฉ์ด ์๋
excerpt
๋ง ๊ฒ์ - ๊ธด ํฌ์คํธ์ ๊ฒฝ์ฐ ๋๋ฝ ๊ฐ๋ฅ์ฑ
โ ๊ณ ๊ธ ๊ฒ์ ๊ธฐ๋ฅ ๋ถ์ฌ
- AND/NOT ์ฐ์ฐ์ ๋ฏธ์ง์
- ์ ํํ ๊ตฌ๋ฌธ ๊ฒ์(โ๊ตฌ๋ฌธโ) ๋ถ๊ฐ
- ๊ฒ์์ด ํ์ด๋ผ์ดํ ์์
โ ์ฑ๋ฅ ํ๊ณ
- ํฌ์คํธ ์ ์ฆ๊ฐ ์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ ์ฆ๊ฐ
- ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ฆ๊ฐ
๐ฏ ๊ฒ์ ์ ํ๋ ํ๊ฐ
๊ฒ์ ์๋๋ฆฌ์ค๋ณ ๊ฒฐ๊ณผ
๊ฒ์์ด | ์์ ๊ฒฐ๊ณผ | ์ค์ ๋์ | ์ ํ๋ |
---|---|---|---|
โwelโ | โwelcomeโ ํฌํจ ํฌ์คํธ | โ ์ ์ ๋งค์นญ | ๋์ |
โjavascriptโ | JS ๊ด๋ จ ํฌ์คํธ | โ ํ๊ทธ/๋ด์ฉ ๋งค์นญ | ๋์ |
โ์๋ฐ์คํฌ๋ฆฝํธโ | ํ๊ธ JS ํฌ์คํธ | โ ํ๊ธ ์ง์ | ๋์ |
โjs tutorialโ | ๊ณต๋ฐฑ ํฌํจ ๊ฒ์ | โ ๏ธ ๋ถ๋ถ ๋งค์นญ๋ง | ์ค๊ฐ |
โ"exact phrase"โ | ์ ํํ ๊ตฌ๋ฌธ | โ ๋ฏธ์ง์ | ๋ฎ์ |
๊ฒ์ ๋๋ฝ ์ฌ๋ก
- ๊ธด ํฌ์คํธ ๋ด์ฉ:
excerpt
๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ด์ฉ - ๋ณตํฉ ๊ฒ์์ด: โA AND Bโ ํํ์ ์กฐ๊ฑด๋ถ ๊ฒ์
- ํน์ ๋ฌธ์: ์ ๊ท์ ํน์ ๋ฌธ์ ์ฒ๋ฆฌ ๋ฏธํก
๐ ๊ฐ์ ๊ถ์ฅ์ฌํญ
๋จ๊ธฐ ๊ฐ์ ๋ฐฉ์ (Low-effort, High-impact)
1. ์ ์ฒด ๋ด์ฉ ๊ฒ์ ์ง์
data-content=""
2. ๊ฒ์์ด ํ์ด๋ผ์ดํ
function highlightSearchTerm(text, term) {
return text.replace(new RegExp(term, 'gi'), `<mark>$&</mark>`);
}
3. ๊ฒ์ ๊ฒฐ๊ณผ ์ ๋ ฌ
- ์ ๋ชฉ ๋งค์นญ > ํ๊ทธ ๋งค์นญ > ๋ด์ฉ ๋งค์นญ ์์ผ๋ก ๊ฐ์ค์น ์ ์ฉ
์ค๊ธฐ ๊ฐ์ ๋ฐฉ์ (Medium-effort, High-impact)
1. ๊ณ ๊ธ ๊ฒ์ ์ฐ์ฐ์
// AND ๊ฒ์: "javascript AND tutorial"
// NOT ๊ฒ์: "javascript NOT beginner"
// ๊ตฌ๋ฌธ ๊ฒ์: "javascript tutorial"
2. ๊ฒ์ ์๋์์ฑ
- ์ธ๊ธฐ ๊ฒ์์ด ์ ์
- ํ๊ทธ ๊ธฐ๋ฐ ์๋์์ฑ
3. ๊ฒ์ ํ์คํ ๋ฆฌ
- ์ต๊ทผ ๊ฒ์์ด ์ ์ฅ (localStorage)
- ์์ฃผ ๊ฒ์ํ ํค์๋ ์ ์
์ฅ๊ธฐ ๊ฐ์ ๋ฐฉ์ (High-effort, High-impact)
1. ์ ๋ฌธ ๊ฒ์ ์์ง ํตํฉ
- Algolia DocSearch ์ฐ๋
- Elasticsearch ๊ตฌ์ถ
2. AI ๊ธฐ๋ฐ ์๋ฏธ ๊ฒ์
- ์ ์ฌ ์๋ฏธ ๊ฒ์ ์ง์
- ์ฝํ ์ธ ๊ธฐ๋ฐ ์ถ์ฒ
3. ๋ค๊ตญ์ด ๊ฒ์ ์ต์ ํ
- ํํ์ ๋ถ์๊ธฐ ์ ์ฉ
- ๋์์ด ์ฌ์ ๊ตฌ์ถ
๐ ๊ตฌํ ์ฐ์ ์์
Phase 1: ์ฆ์ ์ ์ฉ ๊ฐ๋ฅ (1-2์ฃผ)
- ์ ์ฒด ํฌ์คํธ ๋ด์ฉ ๊ฒ์ ๋ฒ์ ํ์ฅ
- ๊ฒ์์ด ํ์ด๋ผ์ดํ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์ค์น ์ ๋ ฌ ๊ตฌํ
Phase 2: ๋จ๊ธฐ ๊ฐ์ (1๊ฐ์)
- AND/OR ๊ฒ์ ์ฐ์ฐ์ ์ง์
- ๊ฒ์ ์๋์์ฑ ๊ธฐ๋ฅ
- ๋ชจ๋ฐ์ผ ์ต์ ํ
Phase 3: ์ฅ๊ธฐ ๊ณํ (3-6๊ฐ์)
- ์ธ๋ถ ๊ฒ์ ์์ง ์ฐ๋ ๊ฒํ
- ์ฑ๋ฅ ์ต์ ํ (lazy loading, indexing)
- ์ฌ์ฉ์ ํ๋ ๋ถ์ ๋ฐ ๊ฐ์
๐ก ๊ฒฐ๋ก ๋ฐ ์ ์ธ
ํ์ฌ Jekyll ๋ธ๋ก๊ทธ์ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ธ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋ ์์ค์ผ๋ก ํ๊ฐ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ฒ์์ ์ฅ์ ์ ํ์ฉํ์ฌ ๋น ๋ฅธ ์๋ต์ฑ์ ์ ๊ณตํ๊ณ ์์ผ๋, ๊ณ ๊ธ ๊ฒ์ ๊ธฐ๋ฅ๊ณผ ์ ํ๋ ์ธก๋ฉด์์ ๊ฐ์ ์ ์ฌ์ง๊ฐ ์์ต๋๋ค.
์ฆ์ ๊ถ์ฅ์ฌํญ:
- ์ ์ฒด ํฌ์คํธ ๋ด์ฉ ๊ฒ์ ๋ฒ์ ํ์ฅ
- ๊ฒ์์ด ํ์ด๋ผ์ดํ ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์
- ๊ฒ์ ๊ฒฐ๊ณผ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋์
์ฅ๊ธฐ์ ์ผ๋ก๋ ํฌ์คํธ ์๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ๋ฌธ ๊ฒ์ ์๋ฃจ์ ๋์ ์ ๊ฒํ ํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ฌ์ฉ์ ํ๋ ๋ถ์์ ํตํ ์ง์์ ์ธ ๊ฐ์ ์ด ํ์ํฉ๋๋ค.
๋ณด๊ณ ์ ์์ฑ์ผ: 2025๋
6์ 9์ผ
๋ถ์ ๋์: Jekyll ๋ธ๋ก๊ทธ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ฒ์ ์์คํ
๋ฌธ์ ๋ฒ์ : v1.0