Elasticsearch Query DSL
사용하는 툴
Multi Elasticsearch Head 를 사용합니다.
키바나 없이 쿼리결과를 확인할 수 있어 편리합니다.
Full Text Query
match_all
모든 문서가 매칭됩니다.
아무 검색조건을 넣지 않으면 자동으로 match_all
로 검색됩니다.
API 로 호출될 경우 match_all
이 자동으로 포함되지 않습니다.
명시적으로 넣어주어야 하며, 넣지 않으면 어떤 문서도 반환되지 않습니다.
GET my_index/_search
{
"query":{
"match_all":{ }
}
}
match
특정 단어를 검색합니다.
text 필드를 제외하고, 모두 정확히 일치하는 데이타만 반환합니다.
text 필드의 경우, 형태소 분석된 단어가 정확히 일치할 때만 반환합니다.
GET my_index/_search
{
"query": {
"match": {
"message": "dog"
}
}
}
두개 이상의 단어를 검색할 수 있습니다.
operator 는 and 또는 or 가 가능하며, 생략시 or 조건으로 검색됩니다.
각 단어는 match
와 동일하게 검색결과를 반환하며,
순서는 상관없습니다.
GET my_index/_search
{
"query": {
"match": {
"message": {
"query": "quick dog",
"operator": "and"
}
}
}
}
match_phrase
단어의 순서까지 검색조건에 포함되며,
중간에 다른 단어의 존재도 허용하지 않습니다.
GET my_index/_search
{
"query": {
"match_phrase": {
"message": "lazy dog"
}
}
}
slop
이라는 옵션으로,
중간에 끼어들 수 있는 단어의 수를 정할 수 있습니다.
GET my_index/_search
{
"query": {
"match_phrase": {
"message": {
"query": "lazy dog",
"slop": 1
}
}
}
}
Bool Query
-
filter
매칭여부만 판단하고 score 를 매기지 않습니다.
cache 가 되므로 다른 검색조건에 앞서 배치합니다. -
must
일치하는 문서만 반환합니다.
-
must_not
일치하지 않는 문서만 반환합니다.
-
should
일치하는 문서의 score 를 높여줍니다.
GET my_index/_search
{
"query": {
"bool": {
"filter": [
{ <쿼리> }, …
],
"must": [
{ <쿼리> }, …
],
"must_not": [
{ <쿼리> }, …
],
"should": [
{ <쿼리> }, …
]
}
}
}
GET my_index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"message": "quick"
}
},
{
"match_phrase": {
"message": "lazy dog"
}
}
]
}
}
}
Bool Query 예제
GET my_index/_search
{
"query": {
"bool": {
"filter": [
{
"match": {
"message": {
"query": "dog"
}
}
},
{
"bool": {
"must_not": [
{
"match": {
"message": "fox"
}
}
]
}
}
],
"must": [
{
"match": {
"message": {
"query": "lazy dog"
}
}
}
],
"should": [
{
"match_phrase": {
"message": "lazy dog"
}
}
]
}
}
}
Range
Data Type 이 keyword, numeric, date 인경우,
검색조건에 부합하는지 true/false 만 존재합니다.
이런 조건들은 Bool : Filter
에서 사용하는 것이 좋습니다.
GET my_index/_search
{
"query": {
"bool": {
"filter": [
{
"match": {
"isUsing": "Y"
}
},
{
"match": {
"sellStatus": "Y"
}
},
{
"range": {
"sellCash": {
"gte": 10000,
"lt": 20000
}
}
},
{
"range": {
"regDate": {
"gte": "2022-05-30"
}
}
}
]
}
}
}
Function Score Query
검색엔진이 적용되는 분야에 따라 가중치를 커스터마이징 해야 하는 경우가 있습니다.
이럴 때는 Function Score Query 가 사용됩니다.
특정 조건에 부합하는 문서의 가중치를 각각 다르게 부여해서,
리스트에 표시되는 순서를 보정할 수 있습니다.
function_score 는 하나의 query 와 하나 이상의 function 으로 구성됩니다.
min_score 를 부여해서 불필요한 문서들이 목록에 등장하는 것을 제거할 수 있습니다.
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"boost": "1",
"functions": [
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "AND",
"analyzer": "my_ngram_analyzer3"
}
}
},
"weight": 50
},
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "AND",
"analyzer": "my_ngram_analyzer2"
}
}
},
"weight": 40
},
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "AND",
"analyzer": "my_ngram_analyzer"
}
}
},
"weight": 30
},
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "OR",
"analyzer": "my_ngram_analyzer3"
}
}
},
"weight": 5
},
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "OR",
"analyzer": "my_ngram_analyzer2"
}
}
},
"weight": 4
},
{
"filter": {
"match": {
"search_string.ngram": {
"query": "아이폰 케이스",
"operator": "OR",
"analyzer": "my_ngram_analyzer"
}
}
},
"weight": 3
}
],
"score_mode": "sum",
"boost_mode": "multiply",
"min_score": 42
}
}
}