ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [4장] 엘라스틱서치 검색
    책/엘라스틱_스택_개발부터_운영까지 2022. 3. 9. 12:28

    내용정리


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

    • 쿼리 컨텍스트: 유사도를 계산해 결과를 보여줌
      • 포함여부를 찾을 때
      • 결과를 제공
    • 필터 컨텍스트: 유사도를 계산하지 않고 일치여부에 대한 결과를 보여줌
      • 정확하게 일치 여부를 찾을 때
      • 예/아니오의 결과를 제공
      • 스코어 계산하지 않음 => 쿼리 속도 빠름
      • 결과 캐시 사용가능
    • 엘라스틱서치는 힙 메모리의 10%를 캐시로 사용

    쿼리 스트링 & 쿼리 DSL

    • 쿼리 스트링
      • 한 줄 정도의 간단한 쿼리
    • 쿼리 DSL
      • 한 줄에 넣기 힘든 복잡한 쿼리
      • JSON기반
    • 해당 용어가 포함된 도큐먼트를 반환

    유사도 스코어

    • BM25 알고리즘 기반
    • 스코어가 높을 수록 찾으려는 도큐먼트에 가까움
    • TF(Term Frequency), IDF(Inverse Document Frequency)
    • 검색에 문서가 얼마나 자주 나타나는지, 중요한 용어인지 등을 판단
    • IDF(Inverse Document Frequency)
      • 문서빈도(DF)는 특정 용어가 얼마나 자주 등장하는지
      • to, the 등은 자주 등장하나 큰 의미가 없음
      • 빈도의 역수(IDF): 발생 빈도가 적을수록 가중치를 높게 줌
    • TF(Term Frequency)
      • 용어빈도(TF)는 특정 용어가 하나의 도큐먼트에 얼마나 많이 등장하는지
      • 많이 반복될수록 주제와 연관 가능성 높음
      • dl: 필드 길이
      • avgdl: 전체 도큐먼트에서 평균 필드 길이
      • dl이 작고, avgdl이 클수록 => TF 값이 큼

    쿼리

    • 리프 쿼리: 특정 필드에서 용어를 찾는 쿼리
      • match, term, rage 등...
      • 전문 쿼리(full text query), 용어 수준 쿼리(term level query)
    • 복합 쿼리: 쿼리를 조합해 사용되는 쿼리
      • bool 등...전문 쿼리 & 용어 수준 쿼리
    • 전문 쿼리: 전문 검색을 위해 사용
      • 인덱스 매핑 시 텍스트 타입 => 분석기 사용, 토큰화
      • 구글, 네이버 등 검색어 검색
      • match query, match phrase query, multi-match query, query string query...
    • 용어 수준 쿼리: 정확히 일치하는 용어를 찾기 위해 사용
      • 인덱스 매핑 시 키워드 타입 => 분석기 사용하지 않음
      • category
      • 대소문자 차이로 실패할 수 있음
      • 관계형 데이터베이스의 WHERE 절과 비슷한 역할
      • term query, terms query, fuzzy query...쿼리
    • 매치 쿼리
      • 검색하고 싶은 필드명을 알아야 함
      • 공백은 or로 인식
      • operator로 and 조건 검색 가능(기본은 or)
    • 매치 프레이즈 쿼리
      • 구(phrase)를 검색할 때 사용
      • 검색어에 사용된 용어들이 모두 포함되면서 용어의 순서까지 맞아야 함
      • 검색시 많은 리소스를 요구하므로 자주 사용하는 것은 좋지 않다
    • 용어 쿼리
      • keyword, text 타입을 구분해야 함
    • 용어들 쿼리
      • 용어 수준 쿼리의 일종이며 여러 용어들을 검색해줌
      • 키워드 타입 매핑 필드에서 사용해야 함
      • 대소문자 구분해야 함
    • 멀티 매치 쿼리
      • 여러 개의 필드에서 검색하기 위한 전문 쿼리의 일종
      • 텍스트 타입 매핑된 필드에서 사용하는 것이 좋음
      • 여러개의 필드에서 개별 스코어를 구한 다음에 가장 큰 값을 대표 스코어로 구함
      • 부스팅(boosting) 기법: 필드에 가중치 두는 방법
    • 범위 쿼리
      • 날짜, 숫자, IP 타입의 데이터는 가능
      • 문자형, 키워드 타입은 불가능
      • 현재 기준으로 검색할 수 있는 표현식이 존재
      • 범위 지원 타입(6): integer_range, float_range, long_range, double_range, date_range, ip_range
      • 날짜/시간 범위 타입은 범위를 지정하여 입력해야 함(date_range 타입과 date 타입은 다름!)
      • relation 파라미터(3)
        • intersects(기본): 쿼리 범위 값이 도큐먼트 범위 데이터를 일부라도 포함
        • contains: 도큐먼트가 쿼리 범위 값을 모두 포함
        • within: 도큐먼트 범위 데이터가 쿼리 범위 값 내에 전부 속해야 함
    • 논리 쿼리(복합 쿼리: compound query)
      • 쿼리 조합 가능
      • 4개 타입 지원: must, must_not, should, filter
      • must_not 다른 타입과 사용하면 좋음
      • must 복수개(and), should 복수개(or)
      • should를 사용하여 검색순위 최적화 가능(우선순위를 상위로 올림)
      • filter: 먼저 필터링하여 불필요한 스코어 계산을 줄여 성능 높일 수 있음
    • 패턴 검색
      • 검색어가 길거나 정확히 알지 못하는 경우
      • 와일드카드 쿼리
        • *: 길이 상관 없음
        • ?: 1개의 문자와 매칭(길이 중요)
      • 정규식 쿼리
        • *: 앞 문자가 0번 혹은 여러번
        • +: 앞 문자가 1번 이상
        • ?: 0번 또는 한번 그러나 자리수 중요함
        • +/?/* 가 맨 앞에 올 수 없음

    스터디

    • keyword, text 타입이 매우 중요하게 사용됨을 알 수 있었다.
    • bool 쿼리시 순서대로 필터링 되는지? 궁금했는데 elasticsearch 엔진 차원에서 최적화를 해줘서 입력시 순서가 중요한 것은 아닌듯 싶다. (관련 stackoverflow 글, elasticsearch 공식문서)
    • 어떤 방식으로 스코어가 계산되는지 대략적으로 살펴볼 수 있어 좋았습니다. to, the 같은 것들은 많이 사용되지만 의미가 없어 IDF(빈도의 역수)로 빈도가 적을수록 가중치를 두는 것이 꽤 흥미로웠습니다.

    링크

    댓글

Designed by Tistory.