엘라스틱서치 검색 쿼리 종류 및 사용 예시
엘라스틱서치 검색 방식
쿼리 컨텍스트
유사도 스코어를 계산해 검색어와 연관성이 높은 도큐먼트들을 매칭해줍니다.
필터 컨텍스트
검색어를 참/거짓 결과로 제공할 뿐, 유사도 스코어는 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