검색 정확도 기준
- 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"
}
}
]
}
}
}
}
}