엘라스틱서치 검색 쿼리 종류 및 사용 예시

엘라스틱서치 검색 방식

쿼리 컨텍스트

유사도 스코어를 계산해 검색어와 연관성이 높은 도큐먼트들을 매칭해줍니다.

필터 컨텍스트

검색어를 참/거짓 결과로 제공할 뿐, 유사도 스코어는 0.0으로 나옵니다.
불필요한 스코어 계산을 줄여서 쿼리 속도와 검색 효율을 높일 수 있습니다.


엘라스틱서치 검색 쿼리 종류

전문 쿼리

전문 검색에 사용하며, 인덱스 매핑 시 텍스트 타입으로 매핑 권장합니다.

종류

  • match : 가장 기본이 되는 검색
  • match_phrase : 용어의 순서까지 완전 일치하는 검색
  • multi_match : 다중 필드에서 검색. 필드에 가중치 부여 가능
  • query string : 연산자를 중심으로 텍스트를 분할하여 검색

용어 수준 쿼리

대소문자까지 정확히 일치하는 용어(term) 검색에 사용하며, 인덱스 매핑 시 키워드 타입으로 매핑 권장합니다.

종류

  • term
  • terms
  • fuzzy : 유사한 알파벳까지 검색 쿼리 (한국어X)

범위 쿼리

날짜, 숫자 등 범위를 지정한 검색에 사용합니다.

종류

  • range

논리 쿼리 (복합 쿼리 = bool)

쿼리들을 조합해 사용하는 쿼리입니다.

종류

  • must : AND
  • must_not : 거짓
  • should : OR
  • filter : 예/아니오 (필터 컨텍스트로 동작 주의)

검색 쿼리 사용 예시

도큐먼트 검색 쿼리

GET 인덱스명/_search

기본적으로 10000개 이하 도큐먼트만 조회 가능하고, 화면에는 10개만 표현됩니다.

도큐먼트 1개 조회 쿼리

GET 인덱스명/_doc/ID

100000개 이상 도큐먼트 검색 쿼리

GET 인덱스명/_search
{
  "query" : {
    "match_all": {}
  },
  "size": "100000",
  "track_total_hits": true # 10000개 이상 검색
}

"track_total_hits": true 없이 100000개 검색 시 에러

illegal_argument_exception

Result window is too large, from + size must be less than or equal to: [10000] but was [100000].

조회 가능한 도큐먼트 수 늘리기

PUT 인덱스명/_settings
{
  "max_result_window": 100000
}

검색어 완전 일치하는 도큐먼트 검색 쿼리

GET 인덱스명/_search
{
  "_source" : ["필드명1", "필드명2"], # 검색 결과로 보여줄 컬럼
  "query" : {
    "bool": {
      "must" : {
        "match_phrase": { "필드명" : "검색어" }
      }
    }
  },
  "size": "20",
  "track_total_hits": true
}

유사도 점수가 높은 순으로 자동 정렬됩니다. size : 20이면 유사도 Top 20개의 데이터만 추출됩니다.

match_phrase는 용어의 순서까지 완전 일치해야 나오고, 검색 시 많은 리소스를 사용하기 때문에 자제해야 합니다.
검색어와 부분 일치하는 도큐먼트 검색 시에는 match_phrase 대신 match 속성을 사용합니다.

다중 컬럼에서 검색어 부분 일치하는 도큐먼트 검색 쿼리

GET 인덱스명/_search
{
  "query" : {
    "multi_match": {
      "query": "검색어",
      "fields": [ "필드명1", "필드명2" ]
    }
  },
  "size": "10000",
  "track_total_hits": true
}

다중 검색 조건으로 검색어 부분 일치하는 도큐먼트 검색 쿼리

GET 인덱스명/_search
{
  "query": {
    "bool" : {
      "must": [
        { "match": { "필드명1": "검색어1"} },
        { "match": { "필드명2": "검색어2"} }
      ]
    }
  },
  "size": 100000,
  "track_total_hits": true
}

논리 쿼리도 이용하였습니다.

검색어 사이에 AND operator 적용

POST 인덱스명/_search
{
  "query": {
    "match": {
      "컬렴명": {
        "query": "하늘 다람쥐",
        "operator": "and" # 하늘, 다람쥐 모두 1개 이상 들어간 도큐먼트 검색
      }
    }
  }
}

operator 파라미터를 생략할 경우 기본값은 or입니다.

검색 쿼리 결과 페이징

GET 인덱스명/_search
{
  "query" : {
    "match": {
      "필드명": "검색어"
    }
  },
  "from": 0, # 0번째 페이지
  "size": 5 # 한 페이지당 5개
}

검색 쿼리 결과 다중 정렬

POST 인덱스명/_search
{
   "query": {
     "match": {
       "필드명" : "검색어"
     }
   },
   "sort" :{
     "필드명1": {
        "order": "asc" # 오름차순 정렬
      },
     "_score": {
        "order": "desc" # 내림차순 정렬 (점수 높은 순)
      }
   }
}

키워드 필드 통계 검색 쿼리

GET 인덱스명/_search
{
  "size": 0,
  "query": {
    "match": {
      "검색필드명": "검색어"
    }
  },
  "aggs":{
    "count":{
      "terms": {
        "field": "통계필드명.keyword" # 기본적으로 text 필드는 통계를 낼 수 없음
      }
    }
  }
}

Leave a comment