참고 자료 :http://lucene.apache.org/core/2_9_4/api/core/org/apache/lucene/search/Similarity.html
- 요소항목 설명
-Term Frequency(tf) : 쿼리하는 키워드가 몇번 나왔는지에 대한 수치이다. 나온 수치의 루트값을 이용한다. tf(t in d) = √frequency -Inverse Document Frequency(idf) : 역빈도 내용인다. 전체 document에서 해당 term이 얼마나 나왔는지를 측정. 다수의 문서에서 나온다면 이 term은 중요하지 않은 것을 간주하고 낮은 weight를 갖는다. idf(t) = 1 + log ( numDocs / (docFreq + 1)) -field length norm : term의 중요도를 측정하는 수치이다. 해당 document에 term의 갯수가 적을 때 더 큰 weight를 갖는다. term의 갯수의 루트 값을 이용한다. ex) query string : 로이조, 로이조 주말 핫녹(high), 로이조 주말 핫 녹화 방송(low) <둘을 대상으로 했을때 상대적인> norm(d) = 1 / √numTerms -queryNorm : 두개 이상의 term으로 쿼리할때 두개의 쿼리에 대한 normalize를 위함이다. 두개의 term으로 쿼리할 경우 query:{ bool:{should:[{term:{field:'aaa'}},{term:{field:'bbb'}}] } 로 검색하게 된다. 이 과정에서 두개의 쿼리로 쪼개지고 두 단어에 대한 상대적인 차이(관계)를 구하기 위함이다. term이 1개일 경우 의미 없다. =1 / √sumOfSquaredWeights / sumOfSqueredWeights = Sigma(t in q)(idf(t) * getBoost(t in q))^2 // -coord : 검색 term이 많이 hit될 수록 보상하는 수치. 검색된 문서에서 쿼리의 Term이 몇 개 들어있는지에 대한 값. (3개단어로 검색쿼리 했고 2개 단어가 맞아 떨어짐. 해당 단어에 대한 점수 * 2/3) -t.getboost : 쿼리시에 넣을 수 있는데 더 높은 가중치를 줘서 검색하게 됨. queryNorm 계산시에 들어감.
- 계산 되는 순서 및 로직
1) 각 term단위로 fieldweight(tf * idf * fieldnorm) 을 구한다. 2) 각 term단위로 queryNorm 을 구한다. 3) 위 둘을 곱한 값들을 갖고 더한다.
- multi term에서 유사관계 판단
cosine similarity 관계. happy hippopotanus로 쿼리 하였을 때 happy 2, hippopotamus 5 의 weight를 갖는다고 하자. 그럼 happy 만 들어간 doc, hippopotamus 만 들어간 문서, 둘 다 들어간 문서에서 각 단어의 weight를 구해 아래와 같이 표현한다. 그리고 쿼리의 벡터와 비슷한 각도를 따지는 것이다. 아래에서는 3번의 doc이 일치했다. happy와 같은 단어는 common word 이므로 어디서나? 낮은 점수가 나올 것 이다.
ex)1) you look happy, 2) you look like hippopotamus 3)you look so happy, hippopotanus
'프로그래밍 > ElasticSearch' 카테고리의 다른 글
[Elasticsearch] Custom analyzer plugin 만들기 (0) | 2015.05.28 |
---|---|
[Elasticsearch] 샤드, 레플리카 갯수 설정 (0) | 2015.05.28 |
Elasticsearch cluster health check (0) | 2015.05.15 |
elasticsearch query, filter 사용 차이 (0) | 2015.05.07 |
dangling indices 문제(index 가 지워지지 않는 현상) (0) | 2015.04.06 |