대머리개발자

solr9 - 형태소 필터 변경 삽질.. 본문

개발이야기/오픈소스 설치

solr9 - 형태소 필터 변경 삽질..

대머리개발자 2024. 9. 27. 15:46
728x90

결론은..웰메이든 된 제품을 있는 그대로 잘 활용하자 ㅋ

 

현재까지는 "서브 기능"으로만 이용 했기 때문에 정확도를 크게 신경 쓰지 않았다.

"주요 기능"으로 많이 사용한다 해서..

 

개선 해야지... 해야지. 했던 부분을 진행하려고 한다. 

 

"고도화"를 검색했을 때 "고도 + 화" => (자동, 선진, 운동화, 화요일, 멀고도, 밝다고도,...)" ..깜놀!

 

일단 모든 단어들을 형태소 분석이 되지 않도록 사용자 사전에 추가해서 급한 불을 껏다.

 

###

일차적인 목표는

원본 Text가 그대로 나와야 된다고 생각한다.

그 이후 형태소로 나눠진 추가적인 결과 리스트가 나오면 인것이다.

 

하지만 지금처럼 전혀 기대 하지 못한 결과가 나와 버렸으니... 튜닝을 해보자! ㅠ

 

형태소를 분석해주는 친구들이 제법 있다. 

https://koalanlp.github.io/sample/comparison

 

sample

KoalaNLP의 사용 샘플

koalanlp.github.io

 

solr9에서 기본적으로 적용된 형태 노리(nori)는 나쁜 녀석이 아니다.

너무 잘 되서 문제지..

 

삽질에 삽질을 거듭해서

커스텀 토크나이저를 바인딩 해봤는데..

 

 

문제가 많았다. ㅋ

 

 Tokenizer을 상속해서 incrementToken()을 오버라이드 하면 된다.

"open korean text"를 이용해서 토큰화를 진행해봤다.

...
@Override
public boolean incrementToken() throws IOException {
    clearAttributes();
    if (tokens == null) {
        StringBuilder buffer = new StringBuilder();
        int available = input.read();

        while (available != -1) {
            buffer.append((char) available);
            available = input.read();
        }

        if (buffer.length() == 0) {
            return false; // 더 이상 입력이 없으면 false 반환
        }

        String text = removeHtmlTags(buffer.toString());
        tokens = OpenKoreanTextProcessorJava.tokensToJavaKoreanTokenList(OpenKoreanTextProcessorJava.tokenize(text));
        tokenIndex = 0;
    }

    if (tokenIndex < tokens.size()) {
        KoreanTokenJava token = tokens.get(tokenIndex);
        String tokenText = token.getText();
        charTermAttr.append(tokenText);
        charTermAttr.setLength(tokenText.length());
        offsetAttr.setOffset(token.getOffset(), token.getOffset() + token.getLength());
        posIncrAttr.setPositionIncrement(1);
        tokenIndex++; // 다음 토큰으로 이동
        return true;
    }
    return false; // 더 이상은 쥐쥐
}
..

 

첫 번째 문제는 큰 데이터 형태소 파싱(색인)이 느렸다.

두 번째 문제는 검색 느렸다. -> 검색 엔진의 사용 이유가 없어졌다.

(물론.. 100% 내가 잘못 짠코드가 문제라고 보여지지만, 나에겐 시간이 없다..)

 

나의 결론은 헛 지거리 하지 말고 ㅠ

 

단순 text_ws 토큰나이저를 이용하자. 즉  공백 기준으로 색인 한자. 특수문자 제거하고

  <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
      <tokenizer name="whitespace"/>
       <filter name="patternReplace" pattern="[^a-zA-Z0-9가-힣\s]" replacement="" replace="all"/> 
       <filter name="lowercase"/>
    </analyzer>
  </fieldType>

 

그래야.. 글자 그대로가 검색된다!!!

 

이제 "고도화"를 검색 했을 때 "..멀고도 험한..."은 검색되지 않는다. ㅠ

 

일부러 사용자 사전을 만들지 않아도 된다.. 글자 그대로 검색하니께..

 

형태소 분석이 필요하다면 복사 필드를 이용해서 쓰자!!!

  <field name="content" type="text_ws" uninvertible="true" indexed="true" stored="true"/>
  <field name="content_copy" type="text_ko" uninvertible="true" indexed="true" stored="true"/>

  <copyField source="content" dest="content_copy"/>

 

 

## 기타...

 

벤치마킹을 해본 내용s

 

1. 티스토리 검색 기능을 통해 "아버지가" 를 검색

 

"아버지"를 검색하고 하이라이팅만 프론트에서 처리한 듯 하고

서머리 내용도 검색 결과가 있는 내용이 아니라 문조건 첫 문장인 듯 하다.

 

조금..안습이다.ㅠ..b

 

 

 

2. 네이버 블로그..Wow

 

UI/UX 드럽게 OLD...But 기능만큼은....명불허전

 

요약내용도 검색어 기준으로 보여주고. 하이라이팅 기능도.. ..오호

728x90