쿼리컨텍스트: 도큐먼트에서 연관성을 계산해 최대한 비슷한 데이터를 찾아준다.
필터 컨텍스트: 찾고자하는 문자열이 정확한지 아닌지 예/아니요만 가지고 찾아준다.
엘라스틱 서치에서 쿼리를 사용하는 방법은 쿼리 스트링과 쿼리 dsl두가지가 있다.
간단한 조건에는 쿼리스트링
복잡한 논리조건이나 코드수준에서 제어하기 위해서는 쿼리 dsl을 사용하는 것이 좋다.
쿼리스트링은 REST API의 URL주소에 쿼리문을 작성하는 방식 흔히 볼수 있다.
주소?샬라샬라
쿼리 dsl은 REST API의 요청 본문 안에 JSON형태로 쿼리를 작성한다. 쿼리 DSL은 엘라스틱 서치의 모든 쿼리 스펙을 지원하기 때문에 매우 강력하며 복잡한 쿼리를 구현할 수 있다.
유사도 스코어는 질의문과 도큐먼트의 유사도를 표현하는 값으로 스코어가 높을수록 찾고자 하는 도큐먼트에 가깝다는 사실을 의미한다.
스코어 알고리즘을 이해하고 있으면 쿼리 DSL의 쿼리를 더 잘 짤수 있게된다.
검색시 explain : true 설정을 추가하면 내부적인 최적화 방법과 어떤 경로를 통해 검색되고 어떤 기준으로 스코어가 계산되는지 알수 있다.
엘라스틱 5x 버전부터 BM25알고리즘을 기본으로 사용한다.
BM25 알고리즘은 검색, 추천에 많이 사용되는 알고리즘으로 TF IDF 개념에 문서 길이를 고려한 알고리즘이다. 검색어가 문서에서 얼마나 자주 나타나는지 검색어가 문서 내에서 중요한 용어인지 등을 판단하는 근거를 제공한다.
문서빈도는 특정 용어가 얼마나 자주 등장했는지를 의미하는 지표다. '그러나''to'와같은 문장을 이어주는 단어는 의미가 없다. 그래서 도큐먼트 내에서 발생 빈도가 적을수록 가중치를 높게 주는데 이를 문서 빈도의 역수IDF라고 한다.
IDF 계산식
'idfm computed as log(1 + (N - n + 0.5)) from: ",
N,n값을 알면 IDF를 구할수 있다.
n : 검색했던 용어가 몇개의 도큐먼트에 있는지 알려주는값
N : 인덱스 전체의 도큐먼트 수
용어빈도 특정용어빈도가 도큐먼트에서 반복되었는지 계산
"tf, computed as freq / (freq + k1 (1 - b + b dl /avgdl)) from"
변수 freqm, k1 ,dl , avgdl 값을 알면 tf 값을 구할수 있다
freq: 도큐먼트 내에서 용어가 나온횟수,
k1 /b 는 알고리즘을 정규화 하기 위한 가중치 디폴트로 취하는 상수값,
dl: 필드 길이
avgdl: 전체 도큐먼트에서 평균 필드길이로 dl이 작고 avgdl이 클수록 TF값이 크게나온다. 이는 짧은 글에서 찾고자 하는 용어가 한번 포함 되있는 것과 책한 권 분량의 도큐먼트에서 찾고자하는 용어가 한번 들어있다면 당연히 짧은글의 찾고자하는 용어의 관련성이 높다라는 개념
엘라스틱 서치는 검색을 위해 쿼리를 지원한다. 크게 리프쿼리와 복합 쿼리로 나눈다.
리프쿼리 : 특정 필드에서 용어를 찾는 쿼리 매치 , 용어, 범위 쿼리등이 있다.
복합퀄기: 쿼리를 조합해서 사용하는 쿼리로 논리쿼리 등이 있다.
*는 모든것을 찾아주고 ?기호는 1개의 문자와 매칭된다. ?기호 하나당 문자하나와 매치되기때문에 문자 길이가 중요하다.
정규식 쿼리 : 정규식을 사용해서 쿼리를 사용할 수 있다.