검색 정확도 기준
- BM25 알고리즘을 이용해 문서에 대한 score 계산
TF (Term Frequency)
- 문서 내에서 자주 등장하는 단어(Term) 에 가중치를 높게 부여,
문서내에서 같은 단어가 여러번 등장한다면 그 단어에 높은 가중치를 주는 알고리즘
IDF (Inverse Document Frequency)
- 많은 문서에서 등장하는 단어의 가중치는 낮추고, 일부 문서에만 등장하는 단어에 대해 높은 가중치 부여
- 전체 문서에서 발생한 term 빈도수가 작을수록 weight가 높다. 문서에 자주 등장하는 단어일수록 낮은 가중치를 주는 알고리즘
- 똑같이 1번 검색이 되었다 하더라도 문서에 자주 등장한 단어가 매칭된 키워드일수록 낮은 가중치
- 문서에 많이 나오는게 좋은게 아닌가? 라고 생각할 수 있겠지만
문서에 공통적으로 많이 등장하는 단어는 실제 우리가 쓰는 단어로 살펴본다면 "은", "는", "다"처럼 형용사, 부사등이 되며 이는 실제로 큰 의미를 가지지 않을 확률이 높음
FLN (Field-Length Norm)
- 두개 이상의 문서에서 동일한 키워드가 동일한 빈도수로 등장한다고 가정할 때, 문서의 길이가 작은 문서에 더 높은 가중치를 부여
function_score 쿼리
검색 필드를 부스팅하여 스코어를 조정하는것은 한계가 있음.
function_score 를 통하여 좀더 디테일하고 deep한 스코어링을 조절할 수 있음.
ex)
1. 상품 검색 시, 주문 수가 많은 제품에 가중치를 부여
2. 인스타그램의 해시태그 검색 시, 좋아요 수에 가중치를 부여 (인기 게시물)
[▼ 180일 이후 게시물에 가중치를 낮게 부여하고, 추천수가 높은 게시물에 가중치를 두어 검색 정확도 커스텀]
GET my-index/_search { "profile": true, "track_scores": true, "track_total_hits": true, "size": 1000, "query": { "function_score": { "functions": [ { "gauss": { "reg_date": { "origin": "now", "scale": "180d", "offset": "180d", "decay": 0.5 } } } ], "query": { "bool": { "must": [], "should": [ { "range": { "recommend_count": { "gte": 1, "boost": 3 } } }, { "multi_match": { "query": "던전 공략", "fields": [ "title" ], "operator": "and" } } ] } } } } }