Meilisearch 완전 정복 (Strapi V4 적용) — 로컬 AI 홈랩 초고속 검색 허브 구축

-

Meilisearch 로컬AI검색 Docker n8n 하이브리드RAG Qdrant Strapi
작성일2026.07.02
카테고리AI랩 > 로컬 AI
난이도중급
소요시간3~4시간
버전Meilisearch v1.7
워크플로우JSON 6개 제공

Meilisearch는 Rust로 작성된 오픈소스 초고속 검색 엔진입니다. Elasticsearch보다 설정이 10배 단순하고, 한국어 오타 허용·페이셋 필터링·InstantSearch.js 위젯이 기본 내장되어 있습니다. 이 가이드에서는 Strapi + n8n + Qdrant + Ollama + WordPress + ComfyUI가 이미 돌고 있는 홈랩에 Meilisearch를 더해, 블로그 즉시 검색부터 KOSPI 데이터 인덱싱, 프롬프트 라이브러리, 홈랩 로그 검색, 하이브리드 RAG까지 10가지 활용법을 워크플로우 파일과 함께 단계별로 다룹니다.

STEP01

Meilisearch란 — 스택 내 포지션 & 비교

검색 엔진 비교

항목ElasticsearchTypesenseMeilisearch
설치 난이도높음 (JVM, 클러스터)중간낮음 (Docker 한 줄)
메모리 사용수 GB~중간경량 (홈랩 적합)
한국어 오타 허용별도 플러그인기본 지원기본 내장
n8n 공식 노드있음없음있음
Strapi 플러그인없음없음공식 플러그인
InstantSearch.js지원지원기본 제공
라이선스SSPLGPL-3MIT (완전 자유)

홈랩 전체 아키텍처

홈랩 검색 허브 최종 구조
            ┌─ Strapi ─ 블로그 발행 → 자동 동기화 ──────────────┐
            │                                                    ↓
데이터 소스 ─┼─ n8n ──── KOSPI/뉴스/RSS ──────────────→  Meilisearch
            │                                                    ↑
            ├─ ComfyUI ─ 이미지 프롬프트 히스토리 ──────────────┤
            │                                                    │
            └─ Obsidian ─ 마크다운 노트 ─── SFTP → n8n ────────┘
                                                    ↓           ↓
                                              키워드 검색    하이브리드 RAG
                                                    ↓           ↓
WordPress InstantSearch 위젯          Qdrant(벡터) + Meilisearch(키워드)
(블로그 방문자 검색)                               ↓ RRF 병합
                                              Ollama LLM → 최종 답변
💡
Qdrant와 역할 분리 — 함께 쓰면 더 강력합니다

Qdrant(벡터)는 “개념적으로 유사한 문서”를, Meilisearch(BM25 키워드)는 정확한 단어·종목코드·에러코드·날짜를 잘 찾습니다. STEP 11에서 두 결과를 RRF로 병합하면 서로의 약점을 보완하는 하이브리드 RAG가 완성됩니다.

STEP02

Docker 배포 + Prometheus 모니터링 연동

💡
Meilisearch v1.3 이후 — 별도 Exporter 불필요

이전에는 meilisearch-exporter라는 별도 컨테이너가 필요했지만, v1.3부터 Meilisearch에 Prometheus 메트릭 엔드포인트(/metrics)가 내장됩니다. meilisearch/meilisearch-exporter 이미지는 Docker Hub에 존재하지 않으므로 사용할 수 없습니다. 환경변수 한 줄만 추가하면 끝입니다.

① 마스터 키 생성 후 .env에 추가

bash
# 안전한 랜덤 키 생성 후 .env에 추가
echo "MEILI_MASTER_KEY=$(openssl rand -base64 32)" >> .env

# 확인
grep MEILI_MASTER_KEY .env

② docker-compose.yml — meilisearch 서비스만 추가

yaml — docker-compose.yml
  meilisearch:
    image: getmeili/meilisearch:v1.7
    container_name: meilisearch
    restart: unless-stopped
    ports:
      - "7700:7700"
    volumes:
      - /mnt/data/02_automation/meilisearch/data:/meili_data
    environment:
      - MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
      - MEILI_ENV=production
      - MEILI_NO_ANALYTICS=true
      - MEILI_MAX_INDEXING_MEMORY=4GiB
      - MEILI_MAX_INDEXING_THREADS=2
      - MEILI_EXPERIMENTAL_ENABLE_METRICS=true
    healthcheck:
      test: ["CMD","wget","--no-verbose","--tries=1","--spider","http://localhost:7700/health"]
      interval: 10s
      timeout: 5s
      retries: 3
    networks:
      - ai-common-net
    logging: *default-logging

# meilisearch-exporter 컨테이너는 필요 없습니다
# v1.3부터 /metrics 엔드포인트가 내장되어 있습니다

③ Prometheus 설정 — Bearer 인증 추가

yaml — prometheus.yml (scrape_configs에 추가)
scrape_configs:
  - job_name: 'meilisearch'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['meilisearch:7700']
    authorization:
      type: Bearer
      credentials: 'YOUR_MEILI_MASTER_KEY'  # .env의 MEILI_MASTER_KEY 값으로 교체
⚠️
prometheus.yml에 마스터 키를 직접 쓰는 것이 불편하다면

Prometheus의 credentials_file 옵션으로 별도 파일에 분리하거나, Docker Secret을 사용할 수 있습니다. 내부망 전용 환경이라면 일반 텍스트로 두어도 실용적으로 무방합니다.

④ 배포 및 동작 확인

1

서비스 시작

docker compose up -d meilisearch

2

헬스 확인

curl http://192.168.0.100:7700/health{"status":"available"}

3

메트릭 엔드포인트 확인

curl -s http://192.168.0.100:7700/metrics -H "Authorization: Bearer ${MEILI_MASTER_KEY}" | head -5# HELP meilisearch_... 로 시작하는 출력이 나와야 정상

⑤ Grafana 대시보드 Import

🚨
Dashboard ID 20197은 MySQL 대시보드입니다 — 사용 불가

인터넷에 잘못된 ID가 퍼져 있습니다. 20197은 MySQL Alert Record 대시보드라서 MySQL 데이터소스를 요구하고 Meilisearch 메트릭은 전혀 표시하지 않습니다. 아래 두 방법 중 하나를 사용하세요.

방법절차특징
방법 A — GitHub JSON (공식 권장)아래 명령어로 JSON 다운로드 → Grafana “Upload JSON file”로 ImportMeilisearch 공식 리포지토리 제공 — 항상 최신
방법 B — Grafana Labs IDGrafana → Import → ID 22733 입력커뮤니티 업로드 버전
bash — 방법 A: 공식 JSON 다운로드 (서버에서 실행)
curl -L -o /tmp/meilisearch-grafana.json   https://raw.githubusercontent.com/meilisearch/meilisearch/main/assets/grafana-dashboard.json

# 다운로드 확인
ls -lh /tmp/meilisearch-grafana.json
1

방법 A: Grafana → Dashboards → Import → “Upload JSON file” → 위에서 받은 파일 선택

Data source: Prometheus 선택 → Import

2

방법 B: Grafana → Dashboards → Import → 22733 입력 → Load → Prometheus 선택 → Import

3

대시보드 확인: 인덱스 크기, 초당 쿼리(QPS), 인덱싱 대기열, 태스크 처리 현황 표시

🚨
마스터 키는 .env에만, docker-compose.yml 직접 입력 절대 금지

마스터 키는 모든 인덱스를 읽기·쓰기·삭제할 수 있는 최고 권한입니다. 반드시 .env 파일에만 보관하고 .gitignore에 추가하세요. 프론트엔드에는 STEP 05에서 발급하는 읽기 전용 키만 사용합니다.

STEP03

인덱스 초기 설정 — 검색 속성 최적화

Meilisearch는 기본값으로 모든 필드를 인덱싱합니다. 검색 대상·필터·정렬 속성을 명시적으로 지정하면 인덱스 크기를 줄이고 검색 속도를 높입니다. 이 STEP은 Meilisearch가 실행 중인 상태에서, 서버 터미널에서 curl 명령어를 실행하는 작업입니다.

💡
언제, 어디서, 무엇을 하는 작업인가요?
  • 언제: STEP 02에서 Meilisearch 컨테이너를 띄운 직후 1회만 실행
  • 어디서: [서버 혹은 PC](192.168.0.100) SSH 터미널에서 직접 실행 — Meilisearch 컨테이너 안에 들어가지 않아도 됩니다
  • 무엇을: Meilisearch REST API에 curl로 속성 설정 요청을 보내는 것 — GUI나 설정 파일이 아니라 API 호출 방식
  • 반드시 해야 하나요: 필수는 아니지만, 기본값은 모든 필드를 검색 대상으로 잡아 인덱스가 불필요하게 커집니다. 한 번 설정해두면 이후 워크플로우가 데이터를 넣을 때 자동으로 적용됩니다

실행 전 — 환경변수 확인

bash — 실행 전 확인 (서버 터미널에서)
# 1. Meilisearch가 실행 중인지 확인
docker ps | grep meilisearch

# 2. 마스터 키 환경변수 불러오기 (.env 파일 위치에서 실행)
export MEILI_MASTER_KEY=$(grep MEILI_MASTER_KEY .env | cut -d= -f2)

# 3. 연결 테스트
curl -s http://192.168.0.100:7700/health
# {"status":"available"} 가 나와야 정상

용도별 인덱스 생성 + 속성 설정

bash — 전체 인덱스 초기 설정 스크립트
MEILI="http://192.168.0.100:7700"
KEY="${MEILI_MASTER_KEY}"

# ── blog-post 인덱스 ──────────────────────────────────
curl -s -X PUT "$MEILI/indexes/blog-post/settings/searchable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["title","excerpt","category","subCategory","wpTags"]'

curl -s -X PUT "$MEILI/indexes/blog-post/settings/filterable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["category","subCategory"]'

curl -s -X PUT "$MEILI/indexes/blog-post/settings/sortable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["createdAt"]'

# ── market-data 인덱스 ────────────────────────────────
curl -s -X PUT "$MEILI/indexes/market-data/settings/searchable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["title","content","source"]'

curl -s -X PUT "$MEILI/indexes/market-data/settings/filterable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["type","date","source"]'

# ── prompt-library 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/prompt-library/settings/searchable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["prompt","tags","style","model","note"]'

curl -s -X PUT "$MEILI/indexes/prompt-library/settings/filterable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["type","model","rating","dateStr"]'

# ── obsidian-vault 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/obsidian-vault/settings/searchable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["title","content","tags","category","excerpt"]'

# ── homelab-events 인덱스 ─────────────────────────────
curl -s -X PUT "$MEILI/indexes/homelab-events/settings/searchable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["title","content","source","instance"]'

curl -s -X PUT "$MEILI/indexes/homelab-events/settings/filterable-attributes" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '["severity","type","date","source"]'

echo "전체 인덱스 설정 완료"
설정 확인 — 제대로 적용됐는지 확인하는 법

각 curl 명령은 즉시 응답으로 {"taskUid": 숫자, "status": "enqueued"} 형태를 반환합니다. “enqueued”는 요청이 접수됐다는 의미이고, 실제 적용은 수 초 내로 자동 완료됩니다. 아래 명령으로 설정이 제대로 반영됐는지 확인할 수 있습니다.

bash — 설정 적용 확인
# blog-post 인덱스의 검색 대상 속성이 잘 들어갔는지 확인
curl -s "http://192.168.0.100:7700/indexes/blog-post/settings/searchable-attributes"   -H "Authorization: Bearer ${MEILI_MASTER_KEY}"
# 출력 예시: ["title","excerpt","category","subCategory","wpTags"]

# 전체 인덱스 목록 확인 (데이터가 들어온 후)
curl -s "http://192.168.0.100:7700/indexes"   -H "Authorization: Bearer ${MEILI_MASTER_KEY}" | python3 -m json.tool | grep '"uid"'
인덱스명용도데이터 소스
blog-post블로그 글 검색Strapi 플러그인 자동 동기화
market-dataKOSPI + 뉴스 검색STEP 06 워크플로우
news-feedRSS 뉴스 피드STEP 07 워크플로우
prompt-libraryAI 프롬프트 이력STEP 08 워크플로우
obsidian-vaultObsidian 노트 전문 검색STEP 09 워크플로우
homelab-events서버/NAS 이벤트 로그STEP 10 워크플로우
STEP04

Strapi 연동 — 블로그 발행 즉시 자동 인덱싱

Strapi에서 글을 Publish하는 순간 n8n 없이 직접 Meilisearch로 스트리밍됩니다.

① 플러그인 설치 (Strapi 컨테이너 내부)

bash
docker exec -it strapi sh -c "cd /opt/app && npm install @strapi/plugin-meilisearch && exit"
docker compose restart strapi

② 플러그인 설정 파일

JavaScript — /opt/app/config/plugins.js
module.exports = ({ env }) => ({
  meilisearch: {
    config: {
      host: 'http://meilisearch:7700',      // 컨테이너명 사용 (같은 네트워크)
      apiKey: env('MEILI_MASTER_KEY'),
    }
  },
});

③ Strapi Admin에서 인덱싱 설정

1

Strapi 관리자 → Settings → Meilisearch 클릭

2

Collection Type: Blog-post 선택 → 동기화 필드 체크

체크 항목: title, excerpt, category, subCategory, slug (content는 제외 권장 — 인덱스 크기 절약)

3

Reload 버튼 → 기존 글 전체 즉시 인덱싱 시작

4

확인: 새 글 Publish 후 Meilisearch에서 검색

curl http://192.168.0.100:7700/indexes/blog-post/search -d '{"q":"테스트"}' -H "Authorization: Bearer $KEY"

STEP05

WordPress 즉시 검색 위젯 + 페이셋 필터

① 읽기 전용 API 키 발급 (프론트엔드 전용)

bash — 검색 전용 키 생성
curl -X POST "http://192.168.0.100:7700/keys" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "WordPress Search Key",
    "actions": ["search"],
    "indexes": ["blog-post"],
    "expiresAt": null
  }'
# 응답에서 "key" 값을 복사 → WordPress 설정에 사용

② WordPress functions.php에 라이브러리 등록

PHP — functions.php
function agibop_enqueue_meilisearch() {
    wp_enqueue_script('instantsearch',
        'https://cdn.jsdelivr.net/npm/instantsearch.js@4/dist/instantsearch.production.min.js',
        [], '4', true);
    wp_enqueue_script('meili-instantsearch',
        'https://cdn.jsdelivr.net/npm/@meilisearch/instant-meilisearch/dist/instant-meilisearch.umd.min.js',
        ['instantsearch'], '0.19', true);
}
add_action('wp_enqueue_scripts', 'agibop_enqueue_meilisearch');

③ 검색 위젯 — 카테고리 페이셋 필터 포함

HTML + JavaScript
<div id="meili-search-wrap">
  <div id="meili-searchbox"></div>
  <div id="meili-refinement"></div>   <!-- 카테고리 필터 -->
  <div id="meili-hits"></div>
  <div id="meili-pagination"></div>
</div>

<script>
const searchClient = instantMeiliSearch(
  'https://meilisearch.agibop.com',   // Cloudflare Tunnel 외부 URL
  'YOUR_SEARCH_ONLY_KEY'
);
const search = instantsearch({ indexName: 'blog-post', searchClient });

search.addWidgets([
  instantsearch.widgets.searchBox({
    container: '#meili-searchbox',
    placeholder: '블로그 검색...',
  }),
  instantsearch.widgets.refinementList({  // 카테고리 필터 위젯
    container: '#meili-refinement',
    attribute: 'category',
    transformItems(items) {
      const labels = { 'ai-lab': 'AI랩', 'finance': '재테크', 'home-lab': '홈랩' };
      return items.map(i => ({ ...i, label: labels[i.label] || i.label }));
    },
  }),
  instantsearch.widgets.hits({
    container: '#meili-hits',
    templates: {
      item: (hit) => `
        <a class="meili-hit" href="/${hit.slug}/">
          <span class="meili-cat">${hit.category}</span>
          <strong>${hit._highlightResult.title.value}</strong>
          <p>${hit._highlightResult.excerpt?.value || ''}</p>
        </a>`,
      empty: '<p>검색 결과가 없습니다.</p>',
    },
  }),
  instantsearch.widgets.pagination({ container: '#meili-pagination' }),
]);
search.start();
</script>
💡
Cloudflare Tunnel로 외부 노출

Meilisearch를 Cloudflare Tunnel로 meilisearch.agibop.com으로 노출하면 스마트폰에서도 검색 위젯이 동작합니다. 읽기 전용 키를 쓰기 때문에 노출되어도 데이터 변경 위험이 없습니다. Zero Trust Policy에서 이 서브도메인만 Public으로 설정하세요.

STEP06

KOSPI + 뉴스 데이터 자동 인덱싱 워크플로우 제공

Yahoo Finance API로 KOSPI 지수를 수집하고, 금융 RSS 피드를 병렬로 받아 market-data 인덱스에 매시간 Upsert합니다.

📦
워크플로우 파일: meili-01-market-data-workflow.json (6개 노드)

n8n → Workflows → Import from File로 가져온 뒤 Credential만 연결하면 즉시 동작합니다.

워크플로우 구조

흐름
매시간 실행 ─┬─→ Yahoo Finance API (KOSPI 지수) ─┐
             └─→ 금융 RSS 피드                  ─┘
                                                  ↓
                          데이터 정형화 + URL 해시로 id 생성
                                                  ↓
                            Meilisearch: market-data 인덱스 Upsert
                                                  ↓
                                          결과 로그 (콘솔)

Import 후 설정할 것

노드설정 항목
5) Meilisearch UpsertCredentials → “Meilisearch Local” 연결
2) KOSPI 지수 조회필요시 API 키(Yahoo Finance Premium) 추가

검색 테스트

bash
# 날짜 필터 + 키워드 검색
curl -X POST "http://192.168.0.100:7700/indexes/market-data/search" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "코스피 상승",
    "filter": "date = \"2026-07-01\"",
    "limit": 5
  }'
STEP07

RSS 뉴스 멀티피드 수집 워크플로우 제공

IT기술·금융·주식 등 복수의 RSS 피드를 2시간마다 자동 수집해 news-feed 인덱스에 적재합니다. URL 해시로 id를 만들어 Upsert하므로 중복 걱정이 없습니다.

📦
워크플로우 파일: meili-02-rss-news-workflow.json (7개 노드)

기본 피드 5개 포함. 워크플로우 2번 노드(RSS 피드 목록 정의) 안의 feeds 배열에 원하는 RSS URL을 추가하세요.

기본 포함 피드 목록

소스카테고리URL
ZDNet KoreaIT기술feeds.feedburner.com/zdnet/korea
전자신문IT기술rss.etnews.com/Section901.xml
매일경제금융경제mk.co.kr/rss/30100041/
한국경제 ITIT기술hankyung.com/feed/it
Yahoo Finance KR주식feeds.finance.yahoo.com/rss/…

피드 추가 방법

JavaScript — 2번 노드 feeds 배열에 원하는 만큼 추가
const feeds = [
  // 기존 5개 ...
  // 추가 예시:
  { url: 'https://www.hani.co.kr/rss/',     category: '뉴스',  source: '한겨레' },
  { url: 'https://www.sedaily.com/RSS/RssNews.xml', category: '경제', source: '서울경제' },
];
STEP08

ComfyUI + 음악AI 프롬프트 라이브러리 워크플로우 제공

ComfyUI 이미지 프롬프트와 ACE-Step / Udio / Suno 음악 생성 프롬프트를 중앙에서 관리합니다. Webhook으로 실시간 저장하거나, ComfyUI API로 히스토리를 일괄 수집합니다.

📦
워크플로우 파일: meili-03-prompt-library-workflow.json (8개 노드)

두 가지 트리거 포함: ① 실시간 Webhook 저장, ② 일일 ComfyUI 히스토리 일괄 수집

프롬프트 저장 API 호출 예시

bash — 이미지 프롬프트 저장
curl -X POST "https://n8n.agibop.com/webhook/meili-prompt-save" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "futuristic AI robot, neon blue, cinematic, 8K, detailed",
    "type": "comfyui",
    "model": "juggernautXL_v9Rdphoto2Lightning",
    "style": "cinematic",
    "tags": "로봇,SF,네온,8K",
    "rating": 5,
    "note": "조명 각도 45도, steps=20이 최적"
  }'
bash — 음악 프롬프트 저장
curl -X POST "https://n8n.agibop.com/webhook/meili-prompt-save" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "[verse] 밤하늘 별빛 아래 [chorus] 우리의 이야기",
    "type": "music",
    "model": "ACE-Step-1.5-XL",
    "style": "K-pop ballad, 80 BPM",
    "tags": "발라드,K팝,감성",
    "rating": 4,
    "note": "infer_steps=50이 품질 좋음"
  }'

프롬프트 검색

bash
# 음악 프롬프트 중 별점 4 이상만 검색
curl -X POST "http://192.168.0.100:7700/indexes/prompt-library/search" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "발라드",
    "filter": "type = \"music\" AND rating >= 4",
    "sort": ["rating:desc"],
    "limit": 10
  }'
STEP09

Obsidian Vault 전문 검색 동기화 워크플로우 제공

SFTP로 Vault 전체 폴더를 30분마다 스캔해 마크다운 노트를 파싱하고 obsidian-vault 인덱스에 동기화합니다. Obsidian 내장 검색보다 빠르고 오타 허용 검색이 됩니다.

📦
워크플로우 파일: meili-04-obsidian-sync-workflow.json (11개 노드)

인덱싱 폴더 목록(posts, published, templates, work, system)이 기본 포함되어 있습니다. 4번 노드의 FOLDERS 배열에서 원하는 폴더만 남기거나 추가하세요.

Import 후 설정할 것

노드설정
5) 폴더별 파일 목록 조회Credentials → “[NAS] SFTP” 연결
7) 파일 다운로드동일 Credential
10) Meilisearch UpsertCredentials → “Meilisearch Local” 연결

검색 API 호출 예시

bash
# 하이라이팅 포함 노트 검색 (오타 허용)
curl -X POST "http://192.168.0.100:7700/indexes/obsidian-vault/search" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "Strapii n8n연동",
    "attributesToHighlight": ["title","content"],
    "highlightPreTag": "**",
    "highlightPostTag": "**",
    "limit": 5
  }'
# "Strapii" 오타도 "Strapi" 결과를 반환합니다
STEP10

홈랩 이벤트 & 알림 로그 인덱싱 워크플로우 제공

Prometheus 알림과 시스템 부하 지표를 매시간 수집해 homelab-events 인덱스에 쌓습니다. 날짜·심각도·소스로 필터링해서 “지난달 critical 알림만 검색”이 가능해집니다.

📦
워크플로우 파일: meili-05-homelab-log-workflow.json (8개 노드)

Prometheus API + [NAS] DSM API 동시 수집. [NAS] API 호출은 SID(세션 ID)가 필요하니 4번 노드의 URL에서 YOUR_SID 부분을 실제 SID로 교체하거나 비워두세요.

심각도별 이벤트 검색

bash
# 이번 달 critical 이벤트 전체 조회
curl -X POST "http://192.168.0.100:7700/indexes/homelab-events/search" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "q": "",
    "filter": ["severity = \"critical\"", "date >= \"2026-07-01\""],
    "sort": ["createdAt:desc"],
    "limit": 50
  }'
STEP11

하이브리드 RAG — Qdrant + Meilisearch + Ollama 워크플로우 제공

Qdrant(벡터)와 Meilisearch(키워드) 결과를 RRF 알고리즘으로 병합하고, 병합된 컨텍스트를 Ollama에 넘겨 최종 답변을 생성하는 완전한 RAG 파이프라인입니다.

📦
워크플로우 파일: meili-06-hybrid-rag-workflow.json (8개 노드)

POST https://n8n.agibop.com/webhook/hybrid-search로 쿼리를 보내면 병합된 검색 결과와 Ollama 답변을 JSON으로 받습니다.

RRF 알고리즘 원리

개념 설명
Qdrant 결과:      [A순위1, B순위2, C순위3]  → 점수: 1/(60+1), 1/(60+2), ...
Meilisearch 결과: [B순위1, D순위2, A순위3]  → 점수: 1/(60+1), 1/(60+2), ...

RRF 합산:  A = 1/61 + 1/63 ≈ 0.0322  (양쪽 상위권)
           B = 1/62 + 1/61 ≈ 0.0326  (양쪽 상위권, 1위)
           C = 1/63         ≈ 0.0159  (Qdrant만)
           D = 1/62         ≈ 0.0161  (Meilisearch만)

최종 순위: B → A → D → C  (양쪽에서 높게 나온 문서가 상위)

API 호출 예시

bash
curl -X POST "https://n8n.agibop.com/webhook/hybrid-search" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "2026년 삼성전자 1분기 실적 요약",
    "indexes": ["blog-post", "market-data", "news-feed"],
    "top_k": 5,
    "generate": true
  }'

# 응답 구조:
# {
#   "query": "...",
#   "answer": "Ollama가 생성한 답변",
#   "sources": [{ "id": "...", "title": "...", "source": "market-data" }, ...],
#   "stats": { "meilisearch_hits": 9, "qdrant_hits": 5 }
# }

Import 후 설정할 것

노드설정
3) Meilisearch 멀티 인덱스 검색Headers → Authorization: Bearer {MEILI_MASTER_KEY}
4) Ollama 임베딩 생성Ollama 임베딩 모델 확인 (nomic-embed-text 설치 여부)
5) Qdrant 벡터 검색컬렉션명 확인 (기본: blog_posts)
7) Ollama 답변 생성사용 모델 확인 (기본: gemma2:latest)
STEP12

멀티 인덱스 통합 검색 UI 구축

블로그·뉴스·프롬프트·Obsidian 노트를 한 검색창에서 동시에 검색하는 통합 UI입니다. Meilisearch의 multi-search API를 활용합니다.

멀티 인덱스 동시 검색 API

bash
curl -X POST "http://192.168.0.100:7700/multi-search" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "queries": [
      { "indexUid": "blog-post",      "q": "Strapi", "limit": 3 },
      { "indexUid": "news-feed",       "q": "Strapi", "limit": 3 },
      { "indexUid": "obsidian-vault",  "q": "Strapi", "limit": 3 },
      { "indexUid": "prompt-library",  "q": "Strapi", "limit": 2 }
    ]
  }'

n8n HTTP Request 노드에서 활용

JavaScript — 멀티 검색 결과 병합 Code 노드
const results = $json.results || [];
const LABEL = { 'blog-post': '블로그', 'news-feed': '뉴스', 'obsidian-vault': 'Obsidian', 'prompt-library': '프롬프트' };

const merged = results.flatMap(r =>
  (r.hits || []).map(h => ({
    ...h,
    _index: r.indexUid,
    _indexLabel: LABEL[r.indexUid] || r.indexUid,
  }))
);

return [{ json: { total: merged.length, results: merged } }];
STEP13

성능 최적화 & 백업 운영 전략

① RTX 3060 서버 기준 권장 설정

환경변수권장값이유
MEILI_MAX_INDEXING_MEMORY4GiBAI/GPU 작업과 메모리 경합 방지
MEILI_MAX_INDEXING_THREADS2CPU 코어 과점 방지
인덱스당 문서 길이3000자 이하 권장인덱스 파일 크기 관리

② 스냅샷 백업 + NAS 자동 복사

bash
# 스냅샷 생성 (비동기, /meili_data/snapshots/에 저장됨)
curl -X POST "http://192.168.0.100:7700/snapshots" \
  -H "Authorization: Bearer ${MEILI_MASTER_KEY}"

# [NAS]로 자동 복사 (cron 또는 n8n Schedule로 자동화)
rsync -avz /mnt/data/02_automation/meilisearch/data/snapshots/ \
  192.168.0.150:/volume1/backup/meilisearch/

③ API 키 관리 전략

키 종류권한사용 위치
마스터 키전체 (읽기·쓰기·삭제).env 파일만 / n8n Credential만
검색 전용 키search만, 특정 인덱스만WordPress 위젯, 프론트엔드
쓰기 전용 키documents.add/update만외부 서비스가 직접 인덱싱 시

④ 최종 운영 체크리스트

  • 헬스 체크: curl http://192.168.0.100:7700/health → available
  • Strapi 플러그인: 새 글 발행 후 인덱스 문서 수 증가 확인
  • WordPress 위젯: 오타 검색 동작 확인 (“스트라피” → “Strapi” 결과)
  • 6개 워크플로우 Active: 인덱스별 문서 수 증가 확인
  • Grafana 대시보드(공식 JSON 또는 ID 22733): QPS·인덱싱 대기열 정상
  • 마스터 키: 프론트엔드 어디에도 노출 안 됨
  • 스냅샷 백업: [NAS]로 정기 복사 자동화 설정
🔍
Meilisearch 통합 완료
이제 홈랩이 초고속 검색 허브로 거듭납니다
Docker 배포 완료 Strapi 자동 동기화 WordPress 즉시 검색 6개 워크플로우 가동 하이브리드 RAG 완성

워크플로우 파일 다운로드 목록

파일명용도노드 수트리거
meili-01-market-data-workflow.jsonKOSPI + 뉴스 자동 인덱싱6개매시간
meili-02-rss-news-workflow.jsonRSS 멀티피드 수집7개2시간마다
meili-03-prompt-library-workflow.jsonComfyUI + 음악AI 프롬프트 저장8개Webhook + 일일
meili-04-obsidian-sync-workflow.jsonObsidian 노트 전문 검색 동기화11개30분마다
meili-05-homelab-log-workflow.json홈랩 이벤트 & 알림 로그8개매시간
meili-06-hybrid-rag-workflow.json하이브리드 RAG (Qdrant + Meilisearch + Ollama)8개Webhook
🗺️ 전체 인덱스 구성 요약
  • blog-post — Strapi 발행 즉시 자동 동기화 → WordPress 즉시 검색 위젯
  • market-data — KOSPI 지수 + 금융 뉴스 매시간 수집 (워크플로우 01)
  • news-feed — IT·경제·주식 RSS 5개 피드 2시간마다 수집 (워크플로우 02)
  • prompt-library — ComfyUI/ACE-Step/Udio 프롬프트 이력 관리 (워크플로우 03)
  • obsidian-vault — 전체 마크다운 노트 오타 허용 검색 (워크플로우 04)
  • homelab-events — Prometheus 알림 + 시스템 부하 이력 (워크플로우 05)

다음에 도전해볼 것

Leave A Reply

Please enter your comment!
Please enter your name here

Related Stories