0. 개요
엘라스틱서치는 검색을 위한 다양한 방법을 제공합니다.
그 중에서, 검색을 위한 쿼리 방법를 제공하는데 이를 Query DSL이라 합니다.
엘라스틱서치의 Query DSL은 모두 JSON 방식을 사용합니다.
이 글에서 사용하는 데이터는 아래와 같습니다.
POST ksb/_bulk
{"index":{"_id":1}}
{"message":"ksb kkk", "age":20}
{"index":{"_id":2}}
{"message":"ksb sss kkk", "age":40}
{"index":{"_id":3}}
{"message":"ksb bbb sss kkk", "age":10}
{"index":{"_id":4}}
{"message":"test sss", "age":100}
{"index":{"_id":5}}
{"message":"test bbb sss", "age":30}
1. 풀 텍스트 쿼리(Full Text Query)
1.1 match_all
math_all은 조건 없이 모든 index의 document를 검색하는 방법입니다. 검색시에 쿼리를 넣지 않으면 해당 방법으로 동작합니다.
GET ksb/_search
1.2 match
가장 많이 사용되는 방법입니다.
쿼리와 일치하는 document를 반환합니다.
GET ksb/_search
{
"query": {
"match": {
"message": "sss"
}
}
}
여러 검색어를 넣을 수 있는데, OR 연산으로 동작합니다.
GET ksb/_search
{
"query": {
"match": {
"message": "sss ksb"
}
}
}
AND 연산을 하고 싶으면, operator를 사용하면 됩니다.
GET ksb/_search
{
"query": {
"match": {
"message": {
"query": "sss ksb",
"operator": "and"
}
}
}
}
1.3 math_phrase
공백을 포함해 입력된 순서를 지키는 document를 검색하고 싶을 때 사용합니다.
GET ksb/_search
{
"query": {
"match": {
"match_phrase": {
"query": "ksb sss"
}
}
}
}
만약 단어들이 일정 공간 이내로 떨어져있을 때 slot을 사용하면 해당 조건을 검색할 수 있습니다.
GET ksb/_search
{
"query": {
"match": {
"match_phrase": {
"query": "ksb sss",
"slot" : 1
}
}
}
}
💡 slot이 크면 검색 범위가 넓어져 관련 없는 document가 검색될 수 있습니다. slot은 1 이하로만 사용하는걸 추천합니다.
1.4 query_string
엘라스틱서치는 루씬을 바탕으로 만들어졌습니다.
URL 검색에 사용되는 루씬의 검색 문법을 엘라스틱서치에 사용하고 싶을 때, query_string을 사용합니다.
GET ksb/_search
{
"query": {
"query_string": {
"default_field": "message",
"query": "(ksb AND bbb) OR \\"bbb sss\\""
}
}
}
2. Bool 복합 쿼리(Bool Query)
상위에 bool 쿼리를 넣고, 내부에 쿼리를 넣으면 쿼리를 조합할 수 있습니다.
bool 쿼리에 네 가지가 있습니다.
- must : 쿼리가 참인 document를 검색합니다.
- must_not : 쿼리가 거짓인 document를 검색합니다.
- should : 일치하는 쿼리의 document 점수를 높입니다.
- filter : 참인 document를 검색하지만, 점수를 계산하지 않습니다. must 보다 빠르고, 캐싱이 가능합니다.
사용 방법은 아래와 같습니다.
GET <인덱스명>/_search
{
"query": {
"bool": {
"must": [
{ <쿼리> }, …
],
"must_not": [
{ <쿼리> }, …
],
"should": [
{ <쿼리> }, …
],
"filter": [
{ <쿼리> }, …
]
}
}
}
2.1 must
GET ksb/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "ksb"
}
},
{
"match_phrase": {
"message": "sss bbb"
}
}
]
}
}
}
2.2 must_not
GET ksb/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"message": "ksb"
}
},
{
"match_phrase": {
"message": "bbb sss"
}
}
]
}
}
}
2.3 should
GET ksb/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "sss"
}
}
],
"should": [
{
"match": {
"message": "ksb"
}
}
]
}
}
}
2.4 filter
filter는 검색에 조건은 추가하지만 스코어에는 영향을 주지 않도록 제어할 때 사용합니다.
보통 쇼핑몰에서 검색어로 정확도가 높은 상품명을 검색하면서 생산 업체를 다시 필터링 하는 등의 용도로 사용이 가능합니다.
GET ksb/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "sss"
}
}
],
"filter": [
{
"match": {
"message": "ksb"
}
}
]
}
}
}
3. 범위 쿼리(Range Query)
범위를 제한 때 사용되는 파라메터는 네 가지가 있습니다.
- gte(Grater-Then or Equal-to) : 이상
- gt(Grater-Then) : 초과
- lte(Less-Then or Equal-to) : 이하
- lt(Less-Then) : 미만
3.1 gte, lte
GET ksb/_search
{
"query": {
"range": {
"age": {
"gte": 20,
"lte": 100
}
}
}
}
3.2 gt, lt
GET ksb/_search
{
"query": {
"range": {
"age": {
"gt": 20,
"lt": 100
}
}
}
}
4. 마무리
엘라스틱서치의 아주 기본적인 검색을 실습했습니다.
어렵거나 복잡한 내용을 제외하려다 보니 많은 내용이 빠질 수 밖에 없었는데, 자세한 내용을 알고 싶은 문은 이 글을 작성할 때 참고한 아래 링크를 통해 확인하시기 바랍니다.
https://esbook.kimjmin.net/05-search
'엘라스틱 서치' 카테고리의 다른 글
스프링부트로 엘라스틱서치 쿼리 날리기 (0) | 2023.06.09 |
---|---|
ELK, Mysql, Kafka 구축 및 연동 (0) | 2023.06.02 |
스프링부트 테스트와 엘라스틱서치 테스트 컨테이너 (0) | 2023.05.27 |
엘라스틱서치 데이터 삽입, 조회, 수정, 삭제, _bulk API (0) | 2023.05.03 |
엘라스틱서치 8.X 도커로 무작성 실행해보기 (0) | 2023.04.25 |