배경 / 목표
대화방을 제목뿐 아니라 채팅 내용으로도 검색할 수 있게 한다. 대화방 제목은 클라가 카드 생성 시 넘겨주는 요약(Card.summary)이다.
제안 해결책
- 검색 대상: 본인 대화 중
Card.summary(제목) 또는 Message.content(채팅 내역)가 키워드에 매칭되는 대화방.
- 엔진: 지금은 MySQL로 충분(초기 규모, 짧은 텍스트). ES는 학습용으로 나중에 붙이되,
ConversationSearchPort 인터페이스 뒤에 구현을 두어 호출부 변경 없이 교체 가능하게 한다.
- 1차 구현: MySQL 8.0
ngram 풀텍스트 인덱스(한글 대응) — messages.content, cards.summary에 FULLTEXT 추가.
- 2차(추후):
ElasticsearchConversationSearch (별도 요청 시).
- API:
GET /api/conversations/search?keyword=&page=&size= (로그인 필요, 본인 대화만). 최신순 페이징.
- 응답: 대화방 목록 —
{ conversationId, title(=Card.summary, 진행 중이면 null), status, createdAt }.
완료 조건(DoD)
- 제목 또는 채팅 내용에 키워드가 포함된 본인 대화방이 검색된다(한글 포함).
- 결과는 최신순 페이징.
- 검색 로직이
ConversationSearchPort 뒤에 있어 엔진 교체 가능(ES 대비).
- 서비스/쿼리 테스트.
기술 고려사항
ngram 파서 최소 토큰 크기(기본 2) 때문에 1자 검색은 무시 → 키워드 최소 길이 가드.
- 마이그레이션 V9:
messages.content, cards.summary에 FULLTEXT ... WITH PARSER ngram.
- 검색 대상 메시지는 유저·캐릭터 발화 모두 포함(채팅 내역 전체).
범위 밖(추후)
- 엘라스틱서치 2차 구현(학습용)
- 매칭 스니펫/하이라이트
배경 / 목표
대화방을 제목뿐 아니라 채팅 내용으로도 검색할 수 있게 한다. 대화방 제목은 클라가 카드 생성 시 넘겨주는 요약(
Card.summary)이다.제안 해결책
Card.summary(제목) 또는Message.content(채팅 내역)가 키워드에 매칭되는 대화방.ConversationSearchPort인터페이스 뒤에 구현을 두어 호출부 변경 없이 교체 가능하게 한다.ngram풀텍스트 인덱스(한글 대응) —messages.content,cards.summary에 FULLTEXT 추가.ElasticsearchConversationSearch(별도 요청 시).GET /api/conversations/search?keyword=&page=&size=(로그인 필요, 본인 대화만). 최신순 페이징.{ conversationId, title(=Card.summary, 진행 중이면 null), status, createdAt }.완료 조건(DoD)
ConversationSearchPort뒤에 있어 엔진 교체 가능(ES 대비).기술 고려사항
ngram파서 최소 토큰 크기(기본 2) 때문에 1자 검색은 무시 → 키워드 최소 길이 가드.messages.content,cards.summary에FULLTEXT ... WITH PARSER ngram.범위 밖(추후)