joonsei
Hello, world!
joonsei
전체 방문자
오늘
어제
  • 분류 전체보기 (32)
    • nodejs (7)
    • javascript (3)
    • Elasticsearch (11)
    • Electron (1)
    • oracle (1)
    • etc (7)
    • MongoDB (1)

인기 글

최근 댓글

최근 글

joonsei
Elasticsearch

Elasticsearch function_score 스코어 계산

2022. 11. 9. 11:43

검색 정확도 기준

  • BM25 알고리즘을 이용해 문서에 대한 score 계산

TF (Term Frequency)

  1. 문서 내에서 자주 등장하는 단어(Term) 에 가중치를 높게 부여,
    문서내에서 같은 단어가 여러번 등장한다면 그 단어에 높은 가중치를 주는 알고리즘

IDF (Inverse Document Frequency)

  1. 많은 문서에서 등장하는 단어의 가중치는 낮추고, 일부 문서에만 등장하는 단어에 대해 높은 가중치 부여
  2. 전체 문서에서 발생한 term 빈도수가 작을수록 weight가 높다. 문서에 자주 등장하는 단어일수록 낮은 가중치를 주는 알고리즘
  3. 똑같이 1번 검색이 되었다 하더라도 문서에 자주 등장한 단어가 매칭된 키워드일수록 낮은 가중치
  4. 문서에 많이 나오는게 좋은게 아닌가? 라고 생각할 수 있겠지만
    문서에 공통적으로 많이 등장하는 단어는 실제 우리가 쓰는 단어로 살펴본다면 "은", "는", "다"처럼 형용사, 부사등이 되며 이는 실제로 큰 의미를 가지지 않을 확률이 높음

FLN (Field-Length Norm)

  1. 두개 이상의 문서에서 동일한 키워드가 동일한 빈도수로 등장한다고 가정할 때, 문서의 길이가 작은 문서에 더 높은 가중치를 부여

 

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"
              }
            }
          ]
        }
      }
    }
  }
}
저작자표시 (새창열림)
    'Elasticsearch' 카테고리의 다른 글
    • failed to obtain in-memory shard lock
    • Elasticsearch Dynamic Templates
    • index illegal_argument_exception
    • Document 데이터 전체 수정
    joonsei
    joonsei
    IT 개발자의 소소한 기술 이야기.

    티스토리툴바