[Solr] 검색엔진 쿼리 문법 고급 기능 - MoreLikeThis, Faceting, Boost, 디버깅, 필터링까지 실전 활용

Solr는 기본적인 검색 기능을 넘어서, 추천 시스템, 필터링, 정렬, 카테고리별 집계 등 다양한 고급 기능을 지원한다.
실무에서 바로 적용할 수 있는 주요 기능들을 예제와 함께 소개한다.
1. MoreLikeThis – 유사 문서 추천 기능
Solr는 특정 문서와 유사한 내용을 가진 문서를 자동으로 추천해주는 기능인 MoreLikeThis(MLT)를 제공한다.
mlt=true&mlt.fl=title,content&mlt.mindf=1&mlt.mintf=1&q=id:12345
이렇게 하면 id=12345인 문서를 기준으로, title과 content 필드의 내용을 분석하여 유사한 문서를 찾아준다.
🔍 mlt.mintf=1 (Minimum Term Frequency)
- 의미 : 기준 문서 안에서 어떤 단어가 최소 몇번 이상 등장해야 유사도 계산에 포함할지를 설정함.
- mintf=1이면, 한 번이라도 등장한 단어는 후보로 인정됨
예: "AI"라는 단어가 기준 문서에 1번만 등장해도 유사 문서 검색에 사용됨
🔍 mlt.mindf=1 (Minimum Document Frequency)
- 의미 : 전체 인덱스에서 어떤 단어가 최소 몇개 문서에 등장해야 유사도 계산에 포함할지를 설정함.
- mindf=1이면, 단 하나의 문서에만 등장해도 후보로 인정됨
예: "AI"이라는 단어가 기준 문서에 있고, 전체 인덱스에서 1개 문서에만 등장해도 유사도 계산에 포함됨
이 값을 낮게 설정하면 희귀한 단어까지 유사도 계산에 포함되기 때문에, 결과가 더 민감해지고 다양해질 수 있다.
반대로 너무 높게 설정하면 흔한 단어만 기준이 돼서 추천 품질이 떨어질 수도 있다.
활용 예:
- 뉴스 기사에서 관련 기사 자동 추천
- 블로그 포스팅에서 유사 주제 글 제안
- 상품 상세페이지에서 “이 상품과 비슷한 추천” 구현
2. Faceting – 카테고리별 집계 기능
Solr의 Facet 기능은 검색된 결과를 기준으로 특정 필드에 대해 값별로 문서 수량을 자동 집계할 수 있다.
예를 들어, category 필드로 집계하면 카테고리별 문서 개수를 보여준다.
facet=true&facet.field=category
결과예시 :
"facet_counts": {
"facet_fields": {
"category": {
"tech": 134,
"finance": 82,
"health": 46
}
}
}
위 예시는 현재 검색 조건에 따라 tech 카테고리에 해당하는 문서가 134개, finance가 82개, health가 46개 있다는 의미다.
특정 값만 대상으로 집계하고 싶다면?
예를 들어 CODE_ID 필드의 값 중 "05"로 시작하는 경우만 집계하고 싶다면 아래처럼 사용한다.
facet.field=CODE_ID
facet.prefix=05
이를 통해 "05"로 시작하는 코드들만 Facet 대상이 된다.
예시 결과는 다음과 같을 수 있다.
결과 예시 :
"facet_counts": {
"facet_fields": {
"ART_ORG_CLASS": {
"0501": 28,
"0502": 17,
"0503": 9
}
}
}
3. Boost 기능 vs qf 기능 – 검색 결과 점수 조절 방식 비교
Solr는 검색 결과의 score를 기준으로 정렬되며, 해당 점수를 튜닝할 수 있는 기능으로 Boost와 qf가 있다.
역할은 유사하지만 적용 방식과 목적에 차이가 있다.
| 항목 | Boost 기능 | qf 기능 |
| 목적 | 특정 값이나 필드에 직접 가중치 부여 | 검색 대상 필드 전체에 가중치 설정 |
| 적용 방식 | 쿼리 내 ^숫자 사용 (title:AI^10) | defType=edismax 사용 시 qf=title^10 content^5 |
| 활용 대상 | 개별 문장이나 키워드 | 전체 검색 대상 필드 |
| 조합 가능성 | 단독 또는 pf, bf와 조합 가능 | pf, bf 등과 함께 설정 가능 |
Boost는 즉석에서 특정 단어를 강조할 때 편리하고,
qf는 검색 시스템 전반의 가중치 정책을 설정할 때 적합하다.
4. 디버깅 기능 – 점수 계산 확인하기
검색 결과가 기대한 대로 나오지 않거나, 특정 필드가 너무 높은 점수를 받는 경우에는 debugQuery=true를 활용하면 내부 점수 계산 방식과 쿼리 파싱 과정을 상세하게 확인할 수 있다.
debugQuery=true&q=title:AI
.결과에는 아래 항목이 포함된다:
- explain: 각 문서별 점수 계산 내역
- parsedquery: 내부적으로 파싱된 쿼리 형식
- QParser: 사용된 쿼리 파서 종류 (edismax, lucene 등)
이를 통해 Boost나 qf가 과도하게 작용하고 있는지를 확인하거나, 쿼리 오작동 여부를 분석할 수 있다.
결과 예시 :
"debug": {
"rawquerystring": "title:AI",
"querystring": "title:AI",
"parsedquery": "title:AI",
"parsedquery_toString": "title:AI",
"QParser": "LuceneQParser",
"explain": {
"doc1": "score = 2.3456\n title:AI -> weight(title:AI in 123) [PerFieldSimilarity], result of:\n score(...)\n ...",
"doc2": "score = 1.8765\n title:AI -> weight(title:AI in 456) [PerFieldSimilarity], result of:\n score(...)\n ..."
}
}
항목별 설명
| 항목 | 의미 |
| rawquerystring | 사용자가 입력한 원본 쿼리 (title:AI) |
| querystring | 내부적으로 처리된 쿼리 문자열 |
| parsedquery | Solr가 실제로 실행한 Lucene 쿼리 객체 |
| parsedquery_toString | 사람이 읽기 쉬운 형태로 변환된 쿼리 |
| QParser | 사용된 쿼리 파서 종류 (LuceneQParser, ExtendedDismaxQParser 등) |
| explain | 각 문서에 대해 점수가 어떻게 계산되었는지 상세 설명 |
📊 explain 항목 예시 해석
- score: 최종 점수
- freq: 해당 필드에서 "AI"가 등장한 빈도
- idf: 역문서 빈도 (희귀성)
- norm: 필드 길이 보정값
이 계산은 BM25 또는 TF-IDF 기반으로 이루어지며, Boost나 필드 가중치가 적용된 경우에도 반영된다.
💡 팁
- score가 예상보다 낮거나 높을 때 → explain을 통해 원인을 분석
- qf, boost, pf 등의 설정이 잘 반영되고 있는지 확인 가능
- 쿼리 파서가 LuceneQParser인지 edismax인지에 따라 결과 해석 방식이 달라짐
5. 필드 존재 여부 기반 필터링
특정 필드가 존재하는 문서만 필터링하거나, 값이 없는 문서를 제외하고 싶을 때는 아래와 같이 처리한다.
fq=price:[* TO *] // price가 존재하는 문서만
fq=-price:[* TO *] // price가 존재하지 않는 문서 제외
또는 특정 코드 패턴을 가진 문서만 걸러낼 수도 있다.
fq=ART_ORG_CLASS:05*
실무 활용 예시
| 목적 | 필터링 방식 |
| 값이 있는 문서만 검색 | fq=summary:* 또는 fq=summary:[* TO *] |
| 값이 없는 문서만 검색 | fq=-summary:[* TO *] |
| 특정 패턴 존재 여부 | fq=code:ABC* |
| 날짜 필드 존재 여부 | fq=created_at:[* TO *] |
💡 팁
- 필드 타입이 string, date, int, float 등 어떤 것이든 적용 가능
- 다만 [* TO *]는 범위 검색이기 때문에 일부 필드 타입에서는 성능 차이가 날 수 있다.
- 멀티값 필드에서도 사용 가능 (예: tags:*)
마무리 정리
Solr의 고급 기능을 적절히 활용하면 단순 텍스트 검색을 넘어서,
- 추천 시스템 구축 (MoreLikeThis)
- 카테고리별 집계와 필터링 (Facet)
- 검색 점수 정교화 (Boost, qf)
- 쿼리 품질 분석 (debugQuery)
- 조건별 정렬 및 노출 제어
까지 검색 시스템 전반의 품질을 한층 끌어올릴 수 있다.