728x90

- 문장은 색인 시점에 Term으로 분해되며, 검색 시 Term이 일치해야 검색이 가능해진다.
- 엘라스틱 서치는 색인 시점에 Analyzer를 통해 분석된 Term, 출현 빈도, 문서 번호와 같이 역색인 구조로 만들어 내부적으로 저장한다.
- 검색 시점에는 Keyword 타입과 같은 분석이 불가능한 데이터와 Text 타입과 같은 분석이 가능한 데이터를 구분해서 분석이 가능할 경우 분석기를 이용해 분석을 수행한다.
- 검색 시점에도 Term을 얻을 수 있으며, 해당 Term으로 역색인 구조를 이용해 문서를 찾고 이를 통해 스코어를 계산해 결과로 제공한다.
검색 질의 표현 방식
검색 API는 기본적으로 Query를 기반으로 동작하며, 조건을 URI검색, Request Body 검색으로 표현할 수 있다.
URI 검색
GET movie_search/_search?q=prdtYear:2018
- Http GET 요청을 활용하는 방식으로 파라미터를 Key=value 형태로 전달하는 방식이다.
- 파라미터로 표현할 수 있는 표현의 한계로 복잡한 Query를 작성하는 것은 불가능하다.
Request Body 검색
POST movie_search/_search
{
"query": {
"term": {
"prdtYear": 2018
}
}
}
- Http 요청 시, Body에 검색할 칼럼과 검색어를 JSON 형태로 표현해서 전달하는 방식
- JSON 형태의 표현을 좀 더 효율적으로 제공하기 위해 Query DSL이라는 문법을 지원
- 엘라스틱서치가 제공하는 검색 API를 모두 활용하기 위해서는 반드시 Request Body 방식을 이용해야 한다.
URI 검색
POST movie_search/_search?a=movieNmEn:Family
- URI 검색은 Request Body에 비해 단순하고 사용하기 편리하지만 복잡한 질의문을 입력하기 힘들다는 단점이 있다.
- 또한 URI 검색을 이용할 경우 엘라스틱에서 제공하는 모든 검색 옵션을 사용할 수 없다(파라미터 전달 표현법으로 한계 존재)
- URI 검색의 장점은 빠르게 웹 브라우저를 통해 테스트할 수 있는 장점이 있다.
자주 사용하는 옵션
| 파라미터 | 기본값 | 설명 |
| q | - | 검색을 수행할 쿼리 문자열 조건을 지정한다 |
| df | - | 쿼리에 검색을 수행할 필드가 지정되지 않았을 경우 기본값으로 검색할 필드를 지정한다 |
| analyzer | 검색 대상 필드에 설정된 형태소 분석기 | 쿼리 문자열을 형태소 분석할 때 사용할 형태소 분석기를 지정한다 |
| analyzer_wildcard | false | 접두어/와일드카드(*) 검색 활성화 여부를 지정한다 |
| default_operator | OR | 두 개 이상의 검색 조건이 쿼리 문자열에 포함될 경우 검색 조건 연산자를 설정한다. |
| _source | true | 검색 결과에 문서 본문 포함 여부를 지정한다 |
| sort | - | 검색 결과의 정렬 기준 필드를 지정한다 |
| from | - | 검색을 시작할 문서의 위치를 설정한다 |
| size | - | 반환할 검색 결과 개수를 설정한다. |
복잡한 URI 검색
POST movie_search/_search?q-movieNmEn:* AND prdtYear: 2017&analyze_wildcard=true&from=0&size=5&sort
=_score: desc, movield:asc&_source_includes=movied, movieNm,mvoieNmEn, typeNm
- URI 검색은 검색 조건을 몇가지만 추가해도 검색식이 너무 복잡해져서 사용하기가 불편하고 가독성도 떨어진다.
- URI 검색은 별도의 검색을 확인할 도구가 없다거나 간단한 조회가 필요할 경우에만 사용하고, RequestBody 방식을 사용하자
Request Body 검색
POST movie_search/_search
{
"query": {
"query_string": {
"default_field": "movieNmEn",
"query": "Family"
}
}
}
결과
POST movie_search/_search
{
"_source": [
"movieId",
"movieNm",
"movieNmEn",
"typeNm"
],
"query": {
"query_string": {
"default_field": "movieNmEn",
"query": "movieNmEn:* OR prdtYear:2017"
}
},
"from": 0,
"size": 5,
"sort": [
{
"_score": {
"order": "desc"
}
},
{
"movieCd": {
"order": "asc"
}
}
]
}
- Http 요청 시, 본문에 JSON 형태로 검색 조건을 기록해서 검색을 요청한다.
- Request Body 검색은 질의 내용을 JSON 형태로 작성하며, 이때 Query DSL이라고 불리는 DSL 문법을 사용한다.
- QueryDSL을 사용하면 복잡한 검색 옵션도 깔끔한 JSON 구조로 표현하는 것이 가능하다.
728x90
'Elastic Search' 카테고리의 다른 글
| Ch04. 데이터 검색 - Query DSL의 주요 쿼리 (0) | 2025.09.14 |
|---|---|
| Ch04. 데이터 검색 - Query DSL 이해하기 (0) | 2025.09.14 |
| Ch03. 데이터 모델링 - Document API 이해하기 (0) | 2025.09.13 |
| Ch03. 데이터 모델링 - 엘라스틱서치 분석기 (0) | 2025.09.13 |
| Ch03. 데이터 모델링 - 필드 데이터 타입 (0) | 2025.09.07 |