Back-End/Solr

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

집탱구리 2025. 7. 4. 08:30
반응형

 

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)
  • 조건별 정렬 및 노출 제어

까지 검색 시스템 전반의 품질을 한층 끌어올릴 수 있다.

반응형