Query DSL(Query Domain Specific Language)은 ES의 document를 검색할 때 사용합니다.
Query DSL에 대해 간단하게 정리해 보도록 하겠습니다.
중간 내용부터 document를 docs로 줄여서 표기하였습니다.
Query and filter Context
ES는 검색 결과에 관련성 점수(relevance score)를 매기고 점수별로 정렬하여 각 document가 쿼리와 얼마나 일치하는지 측정하게 됩니다.
이 관련성 점수는 _score meta-field에 반환되며 양의 부동 소수점 숫자값을 가집니다. 이 숫자가 높을수록 높은 관련성을 가지게 됩니다.
Query context
Query context에서 쿼리 절은 '이 document가 이 쿼리 절과 얼마나 일치하는가?'에 대한 질의에 답하게 됩니다.
쿼리 절은 document의 일치 여부와 _score 필드의 점수를 계산합니다.
filter context와 달리 캐싱되지 않습니다.
Filter context
Filter context의 쿼리 절은 '이 document가 쿼리 절과 일치합니까?'에 대한 질의에 답하게 됩니다.
응답은 질의에 대한 yes/no이며 점수는 계산되지 않습니다.
ES는 자주 사용되는 filter를 자동으로 캐싱하고 성능을 향상합니다.
ex)
- Does this timestamp fall into the range 2015 to 2016?
- Is the status field set to "published"?
Query, filter context 예시
다음은 search API에서 사용되는 쿼리 절의 예시입니다.
- title필드에는 'Search'가 포함되어 있다. (search)
- content필드에는 'Elasticsearch'가 포함되어 있다. (elasticsearch)
- status필드에는 'pyblished' 단어가 정확히 포함되어 있다. (published)
- publish_date필드에는 2015-01-01 이후의 날짜가 포함된다.
1. 이 query매개 변수는 query context를 나타냅니다.
2. bool 및 두 개의 match 절은 query contex에서 사용되며 각 document가 얼마나 잘 일치하는지 점수를 매기는 데 사용됩니다.
3. filter매개 변수는 filter context를 나타냅니다. term과 range 절은 filter context에서 사용되며. 일치하지 않는 document는 필터링하지만 일치하는 점수에는 영향을 미치지 않습니다.
Boolean Query (링크)
true/false를 사용하는 쿼리입니다.
- must: 일치하는 document에 나타나야 하며 점수에 기여합니다.
- filter: 일치하는 document에 나타나야 합니다. 점수는 무시됩니다. filter context에서 실행됩니다. 즉, 스코어링이 무시되고 캐싱에 고려됩니다.
- should: 일치하는 문서에 나타나야 합니다.
- must_not: 일치하는 document에 나타나지 않아야 합니다. filter context에서 실행됩니다. 점수가 무시되므로 모든 document에 대한 점수 0이 반환됩니다.
다음은 age:22이지만 status:KS가 아닌 doc를 검색합니다.
curl -X GET "localhost:9200/bank/account/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "age": "22" } }
],
"must_not": [
{ "match": { "state": "KS" } }
]
}
}
}
'
Boosting Query (링크)
부정 쿼리와 일치하는 docs의 관련성 점수를 줄이면서 긍정적 쿼리와 일치하는 docs를 반환합니다.
boosting query를 사용하여 특정 docs검색 결과에서 제외하지 않고 강등시킬 수 있습니다.
- positive: (Required, query object) 실행할 쿼리입니다. 반환된 모든 docs는 이 쿼리와 일치해야 합니다.
- negative: (Required, query object) 일치하는 문서의 관련성 점수를 낮추는 데 사용되는 쿼리입니다.
- negative_boost: (Required, float) 0과 1.0 사이의 부동 소수점 숫자는 음수 쿼리와 일치하는 문서의 관련성 점수를 낮추는 데 사용됩니다.
Term Query (링크)
제공된 필드에 정확한 용어 가 포함된 문서를 반환합니다.
term쿼리를 사용하여 가격, 제품 ID 또는 사용자 이름과 같은 정확한 값을 기준으로 문서를 찾을 수 있습니다.
GET /_search
{
"query": {
"term": {
"user": {
"value": "Kimchy",
"boost": 1.0
}
}
}
}
term query를 text 필드 검색에 사용하면 올바른 결과를 얻을 수 없습니다.
문자열을 ES에 insert 했다면 ES에서는 standard analyzer에서 토큰이라 불리는 개별 단어로 분리합니다.
만약 'Quick Brown Foxes!'라는 text를 insert 하면 [quick, brown, fox]으로 분리 및 변경합니다.
text를 검색하고자 하면 아래와 같이 match를 이용하면 됩니다.
GET my_index/_search?pretty
{
"query": {
"match": {
"full_text": "Quick Brown Foxes!"
}
}
}
참조
'infra > ELK' 카테고리의 다른 글
[ELK] docker compose이용하여 elk stack구축해보기 (0) | 2020.02.12 |
---|---|
[ELK] Elasticsearch의 데이터 검색 - search API (0) | 2020.01.19 |
[ELK] Elasticsearch의 데이터 검색 (0) | 2020.01.19 |
[ELK] ELK Stack을 구축해 보자 - 로그 파일 수집하기 (0) | 2019.12.28 |
[ELK] ELK Stack을 구축해 보자 - Nginx 로그 수집하기 (0) | 2019.12.26 |
댓글