Skip to content

Latest commit

 

History

History
99 lines (96 loc) · 4.79 KB

4장_엘라스틱서치_검색.md

File metadata and controls

99 lines (96 loc) · 4.79 KB

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

  • 쿼리 컨텍스트: 유사도를 계산해 결과를 보여줌
    • 포함여부를 찾을 때
    • 결과를 제공
  • 필터 컨텍스트: 유사도를 계산하지 않고 일치여부에 대한 결과를 보여줌
    • 정확하게 일치 여부를 찾을 때
    • 예/아니오의 결과를 제공
    • 스코어 계산하지 않음 => 쿼리 속도 빠름
    • 결과 캐시 사용가능
  • 엘라스틱서치는 힙 메모리의 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번 또는 한번 그러나 자리수 중요함
      • +/?/* 가 맨 앞에 올 수 없음