엘라스틱 서치 검색 정리

25gStroy·2022년 5월 22일
0

ELK

목록 보기
2/6

엘라스틱서치 검색

  • 쿼리컨텍스트
  • 필터 컨텍스트
  • 쿼리스트링과 쿼리 dsl의 차이점

쿼리컨텍스트와 필터 컨텍스트

쿼리컨텍스트: 도큐먼트에서 연관성을 계산해 최대한 비슷한 데이터를 찾아준다.
필터 컨텍스트: 찾고자하는 문자열이 정확한지 아닌지 예/아니요만 가지고 찾아준다.

쿼리스트링과 쿼리 dsl

엘라스틱 서치에서 쿼리를 사용하는 방법은 쿼리 스트링과 쿼리 dsl두가지가 있다.
간단한 조건에는 쿼리스트링
복잡한 논리조건이나 코드수준에서 제어하기 위해서는 쿼리 dsl을 사용하는 것이 좋다.

쿼리스트링

쿼리스트링은 REST API의 URL주소에 쿼리문을 작성하는 방식 흔히 볼수 있다.
주소?샬라샬라

쿼리 DSL

쿼리 dsl은 REST API의 요청 본문 안에 JSON형태로 쿼리를 작성한다. 쿼리 DSL은 엘라스틱 서치의 모든 쿼리 스펙을 지원하기 때문에 매우 강력하며 복잡한 쿼리를 구현할 수 있다.

유사도 스코어

유사도 스코어는 질의문과 도큐먼트의 유사도를 표현하는 값으로 스코어가 높을수록 찾고자 하는 도큐먼트에 가깝다는 사실을 의미한다.
스코어 알고리즘을 이해하고 있으면 쿼리 DSL의 쿼리를 더 잘 짤수 있게된다.
검색시 explain : true 설정을 추가하면 내부적인 최적화 방법과 어떤 경로를 통해 검색되고 어떤 기준으로 스코어가 계산되는지 알수 있다.

스코어 알고리즘 BM25

엘라스틱 5x 버전부터 BM25알고리즘을 기본으로 사용한다.
BM25 알고리즘은 검색, 추천에 많이 사용되는 알고리즘으로 TF IDF 개념에 문서 길이를 고려한 알고리즘이다. 검색어가 문서에서 얼마나 자주 나타나는지 검색어가 문서 내에서 중요한 용어인지 등을 판단하는 근거를 제공한다.

IDF 계산

문서빈도는 특정 용어가 얼마나 자주 등장했는지를 의미하는 지표다. '그러나''to'와같은 문장을 이어주는 단어는 의미가 없다. 그래서 도큐먼트 내에서 발생 빈도가 적을수록 가중치를 높게 주는데 이를 문서 빈도의 역수IDF라고 한다.
IDF 계산식
'idfm computed as log(1 + (N - n + 0.5)) from: ",
N,n값을 알면 IDF를 구할수 있다.

n : 검색했던 용어가 몇개의 도큐먼트에 있는지 알려주는값
N : 인덱스 전체의 도큐먼트 수

TF계산

용어빈도 특정용어빈도가 도큐먼트에서 반복되었는지 계산
"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값이 크게나온다. 이는 짧은 글에서 찾고자 하는 용어가 한번 포함 되있는 것과 책한 권 분량의 도큐먼트에서 찾고자하는 용어가 한번 들어있다면 당연히 짧은글의 찾고자하는 용어의 관련성이 높다라는 개념

쿼리

엘라스틱 서치는 검색을 위해 쿼리를 지원한다. 크게 리프쿼리와 복합 쿼리로 나눈다.

리프쿼리 : 특정 필드에서 용어를 찾는 쿼리 매치 , 용어, 범위 쿼리등이 있다.
복합퀄기: 쿼리를 조합해서 사용하는 쿼리로 논리쿼리 등이 있다.

전문 쿼리와 용어 수준 쿼리

  • 전문 쿼리: 전문 검색을 하기 위해 사용된다. 인덱스 매핑시 텍스트 타입으로 매핑해야한다.
  • 용어수준 쿼리: 정확히 일치하는 용어를 찾기위해 사용 인덱스 매핑시 필드를 키워드 타입으로 매핑해야한다.
    rdb에 where절과 비슷함
  • 매치쿼리 : 용어수준 쿼리, rdb에 or와 비슷하다.
  • 매치프레이즈 쿼리 : 구를 검색할때 사용한다. 구는 동사가 아닌 2개 이상의 단어가 연결되어 뜻을 이루는 단어 '24인치 텔레비전' 과같이.
    매치프라이즈 쿼리는 리소스가 많이 요구돼서 자주사용하는것은 좋지 않다.
  • 용어쿼리 : 용어수준쿼리에 가장 대표적인 쿼리. 매치쿼리와 비슷하지만 토크나이징 되지않고 찾고자하는 정확한 문자열만 찾아준다.
  • 용어들 쿼리 : 용어들 쿼리는 용어수준 쿼리의 일종 여러용어들을 검색한다.
  • 멀티 매치 쿼리 : 검색하고자 하는 용어난 구절이 정확히는 어떤 필드에 있는지 모르는 경우가 있다.이와같이 여러개의 필드에서 검색하기 위한 멀티 매치쿼리는 전문 검색 쿼리의 일종 텍스트 타입으로 매핑된 필드에서 사용하는것이 좋다.
    • 필드명에 * 사용가능
    • 필드에 가중치 두기 가능
      • 부스팅기법 : 필드명 끝에 ^x 를 사용해서 가중치를 표현한다. 그렇게하면 필드별로 가중치를 나눠 검색할 수있다.
  • 범위 쿼리 : 날짜와 숫자같은 범위 안에 포함된 데이터를 찾을때 range
    • 검색 범위를 지정하는 파라메터
      • gte : 10 = 10과 같거나 10초과인값
      • gt : 10 10초과
      • lte: 20 20 보다 같거나 작은값
      • lt: 20 20보다 보다 작은값
    • 범위데이터 타입
      • integer_range
      • float_range
      • double_range
      • date_range
      • ip_range
  • 논리쿼리 : 복합쿼리로 쿼리를 조합해서 사용할 수 있다. '서울 지역' 에서 발생한 데이터이면서 '제주도 지역' 에서 발생하지 않은 데이터를 검색하거나 할때 사용 4개 타입지원
    • must : 쿼리를 실행하여 참인 도큐먼트를 찾는다 복수쿼리는 AND연산
    • must_not :쿼리를 실행해서 거짓인 도큐먼트를 찾는다 다른타입과 같이 사용할 경우 도큐먼트에서 제외
    • should : 단독으로 사용시 쿼리를 실행하여 참인 도큐먼트를 찾는다 복수의 쿼리는 OR연산 적용
    • filter : 쿼리를 실행하여 예/아니요 형식의 필터 컨텍스트를 수행한다.

와일드카드 * 와 ? 의차이점

*는 모든것을 찾아주고 ?기호는 1개의 문자와 매칭된다. ?기호 하나당 문자하나와 매치되기때문에 문자 길이가 중요하다.

정규식 쿼리 : 정규식을 사용해서 쿼리를 사용할 수 있다.

profile
애기 개발자

0개의 댓글