Query DSL이란?
- Elasticsearch에서 쿼리 실행에 사용할 수 있도록 JSON 스타일의 도메인 전용 언어
- Query context
- 전문 검색 시 사용 - 분석기에 의해 분석이 수행되고 연관성 관련 score를 계산
- ex) "Harry Portter" 같은 문장 분석
- Filter Context
- 조건 검색 시 사용 - Yes/No로 단순 판별만 가능하며 연관성 관련 score 계산을 하지 않음
- ex) "create_year" 필드의 값이 2023년인지 여부
Query DSL의 주요 쿼리
Match all query
: 모든 문서를 검색하는 쿼리
{
"query": {
"match_all": {}
}
}
Match query
: 텍스트, 숫자, 날짜 등이 포함된 문장을 형태소 분석을 통해 term으로 분리한 후 이 term들을 이용해 검색 질의를 수행
{
"query": {
"match": {
"message": {
"query": "this is a test"
}
}
}
}
Multi-match query
: Match query와 기본적인 사용 방법은 동일하나 단일 필드가 아닌 여러 개의 필드를 대상으로 검색해야 할 때 사용
{
"query": {
"multi_match" : {
"query" : "this is a test",
"fields" : [ "subject^3", "message" ]
}
}
}
Types
- best_fields (default)
- 모든 필드에 대해 스코어를 계산한 뒤, 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
- 나머지 필드에 대해서는 tie_breaker가 설정되었을 경우 tie_breaker * score를 해서 더함
- most_fields
- 모든 필드에 대해 match 되는 각각의 필드에 대해 점수를 계산하고 합한 뒤 필드 개수로 나누어서 최종 스코어 계산
- phrase
- 모든 필드에 대해 Match phrase query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
- phrase_prefix
- 모든 필드에 대해 Match phrase prefix query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
- bool_prefix
- 모든 필드에 대해 Match bool prefix query 실행 후 가장 잘 match 되는 1개의 필드를 기준으로 스코어를 계산
- cross_fields
- 여러 필드가 일치해야 하는 구조화된 문서에 유용
- 필드를 기준으로 계산하지 않고 term을 기준으로 모든 필드를 하나의 필드로 합친 뒤 match 되는지 확인하여 스코어 계산
- 즉 문서가 일치하려면 검색 키워드의 모든 term이 하나 이상의 필드에 있어야 함
Term query
: Match query와 다르게 별도의 분석 작업을 수행하지 않고 입력된 텍스트가 존재하는 문서를 찾는다.
- keyword 데이터 타입을 사용하는 필드를 검색하려면 Term query를 사용해야 함
- Term query는 검색어를 하나의 term으로 처리하기 때문에 필드에 term이 정확히 존재하지 않는 경우 검색이 되지 않음
- id, price와 같은 정확한 값을 기반으로 검색하려고 할 때 사용
{
"query": {
"term": {
"user.id": {
"value": "kimchy",
"boost": 1.0
}
}
}
}
Prefix query
prefix란? 접두사 라고 하며, 어떤 단어의 앞에 붙어 뜻을 첨가하여 하나의 다른 단어를 이루는 말을 이른다.
ex) ‘맨주먹·덧버선·풋사과·군소리’ 등에서 ‘맨―’·‘덧―', '풋-', '군-'
: 해당 접두사가 있는 모든 문서를 검색하는 데 사용한다.
{
"query": {
"prefix": {
"user.id": {
"value": "ki"
}
}
}
}
Match phrase query
phrase란? 둘 또는 그 이상의 어절로 이루어져 한 덩어리로써 절이나 문장의 성분이 되는 동일한 말의 단위
: Match query와 동일하게 분석 작업을 수행하는 것은 동일하나, 분석한 토큰이 모두 존재하고 순서도 순차적으로 동일한 document만을 검색한다.
- Match query는 token들 중에 일치하는 키워드가 하나라도 존재하면 document에 포함한다는 점에서 차이가 있다.
Match phrase prefix query
: match_phrase query처럼 분석 작업을 수행한 term들이 모두 존재하고 순차적으로 동일한 document를 검색한다.
match_phrase query와의 차이점은 마지막 term은 prefix query로 검색을 수행한다는 점이다.
{
"query": {
"match_phrase_prefix": {
"message": {
"query": "quick brown f"
}
}
}
}
"quick brown fox"와 "two quick brown ferrets"는 검색이 되고, "the fox is quick and brown"은 검색되지 않는다.
Match bool prefix query
: 분석 작업을 수행한 후 term들을 가지고 bool query를 실행하며, bool query 내에서는 마지막 term을 제외한 각 term들은 term query로 적용되고 마지막 term에 한해서만 prefix query가 적용된다.
{
"query": {
"match_bool_prefix" : {
"message" : "quick brown f"
}
}
}
Match bool prefix query를 아래와 같이 표현할 수 있다.
{
"query": {
"bool" : {
"should": [
{ "term": { "message": "quick" }},
{ "term": { "message": "brown" }},
{ "prefix": { "message": "f"}}
]
}
}
}
match_phrase_prefix query와의 차이점은 match_phrase_prefix query는 분석한 term들을 구문으로 일치시키지만
match_bool_prefix query는 어떤 위치이든 term이 존재한다면 일치된다는 점이다.
"quick brown f"라는 문장을 가지고 각각의 쿼리를 실행했을 때,
match_bool_prefix query는 "quick brown fox"도 검색되고, "brown fox quick"도 검색 가능하다.
match_phrase_prefix query는 "quick brown fox"는 검색되지만, term들의 순서가 다른 "brown fox quick"는 검색되지 않는다.
Bool query
: 하나의 쿼리나 여러 개의 쿼리를 조합해서 검색할 수 있다.
- AND, OR, NAND, FILTER를 must, must_not, should, filter로 표현
{
"query": {
"bool" : {
"must" : {
"term" : { "user.id" : "kimchy" }
},
"filter": {
"term" : { "tags" : "production" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tags" : "env1" } },
{ "term" : { "tags" : "deployed" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}
이외에도 많은 Query들에 대한 내용을 elastic document에서 확인할 수 있다.
<참고>
- 위키북스 - 엘라스틱서치 실무 가이드
- https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
'Programming > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 검색 템플릿이란? (Search Template) (0) | 2023.03.26 |
---|