[Elasticsearch] 점수와 부스트
엘라스틱서치에서 검색은 기본적으로 "점수(score)"라는 시스템을 통해서 이루어진다.
예외케이스도 있긴 하지만, 어떤 항목이 검색조건에 부합할때마다 정해진 계산식에 의해서 "점수"를 더해주고, 점수가 높은 항목을 우선으로 보여주는 것이다.
점수 모니터링
계산된 점수는 그냥 리스폰스로 보여주긴 하는데
검색품질을 개선하려다 보면 점수가 어떤식으로 산출되고, 이놈이 왜 먼저 노출되는지를 확인해야 할 일이 잦다.
그러려면 explain 옵션값을 true로 주면 된다.

그럼 점수와 함께 이런저런 복잡한 계산식들이 막 튀어나오는데
다 볼 필요는 없고, 어떤 값이 어떤 항목에 매칭돼서 점수가 얼마나 부여됐는지만 보면 된다.
점수 부스트(boost)
실질적으로 검색을 구현하다보면, 당연히 여러가지 조건을 복합적으로 걸어야 할 때가 많다.
하지만 그 조건들의 우선순위가 항상 동등할 수는 없다.
예를 들어 카테고리와 상품명을 검색조건으로 다 걸어뒀더라도, 카테고리에 대한 우선순위가 높아야할 수도 있고, 상품명에 대한 우선순위가 높아야할 수도 있는 것이다.
한번 테스트를 해보자.
"샴푸 가구"로 검색했을 경우에는 지금 아래와 같이 검색결과 노출되고 있다.
상품명 중에 "샴푸"와 일치하는 것이 있고, 카테고리 중에서 "가구"와 매칭되는 것이 있다.
만약 여기서 상품명에 대한 검색 우선순위를 높이고 싶다면 다음과 같이 boost 옵션값을 넣어주면 된다.
저렇게 값을 100으로 써두면 저 일치도에 대해서 점수를 100배로 뻥튀기해준다.
실제로도 점수가 0.72...에서 72점으로 대폭 오른 것을 볼 수 있다.
multi_match문에서는 필드명에 ^숫자의 형태로 지정해줄 수 있다. 기능은 같다.

이런건 검색결과 확인하면서 상황에 따라 조금씩 균형을 맞춰주면 된다.
점수 필터링
가끔 조건을 이것저것 너무 많이 달다보면 연관도가 너무 낮은것까지 잡다하게 결과로 뽑힐 수가 있다.
생뚱맞은게 너무 많으면 그냥 그렇기도 하고, 정렬조건을 바꿀때 조잡스럽게 보일 수도 있다.
그래서 나는 최소점수제한을 걸어서 필터링을 종종 하곤 한다.
min_score 값을 설정해주면 되는데, 아래처럼 50으로 적어두면
50점 미만으로 산정된 검색결과는 전부 잘려버리고, 50점 이상의 결과만 노출된다.
수치는 상황봐서 잘 결정하면 된다.
explain으로 어느 점수대까지가 유효하다 할만한 수치인지 찍어보고...
제한을 너무 높게 걸면 보여야 할것도 안보일 수 있으니 잘 확인하고, 좀 널널하게 잡는걸 권한다.
참조
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html