[개념] Elasticsearch Query (Query DSL, Aggregation)
[ search API ]
Elasticsearch 는 search API를 사용하여 검색 기능을 지원한다.
search API는 query dsl와 aggregation 2가지로 구성되어 있으며 아래 공식 문서에서도 확인할 수 있다.
Query DSL | Elasticsearch Guide [8.11] | Elastic
Query DSL | Elasticsearch Guide [8.11] | Elastic
Elasticsearch provides a full Query DSL (Domain Specific Language) based on JSON to define queries. Think of the Query DSL as an AST (Abstract Syntax Tree) of queries, consisting of two types of clauses: Leaf query clauses Leaf query clauses look for a par
www.elastic.co
Aggregations | Elasticsearch Guide [8.11] | Elastic
Aggregations | Elasticsearch Guide [8.11] | Elastic
An aggregation summarizes your data as metrics, statistics, or other analytics. Aggregations help you answer questions like: What’s the average load time for my website? Who are my most valuable customers based on transaction volume? What would be consid
www.elastic.co
[ Query DSL ]
Elasticsearch에서 제공하는 Query 기능이다.
(1) Bool Query
Elasticsearch에서는 여러 query를 함께 사용하기 위해 Bool query를 사용하는데 아래와 같이 구성되어 있다.
GET {인덱스명}/_search
{
"query": {
"bool": {
"filter": [
{},
{}
],
"must": [
{},
{}
],
"must_not": [
{},
{}
],
"should": [
{},
{}
]
}
}
}
- 구성
- filter : 이 조건이 있어야만 해
- must : 이 조건이 있는 doc 검색을 해줘
- must_not : 이 조건이 없는 doc 검색을 해줘
- should : 이 조건은 점수 더 주자
위에서 filter와 must의 차이는 아래와 같습니다.
- 검색이 부합하는 정도인 score의 차이이다.
- filter은 score을 계산할 필요가 없고 must는 score을 계산한다.
- 이렇게 분리해야 CPU를 효율적으로 사용할 수 있기 때문이다.
- filter로 먼저 거르고 must를 통해 더 부합하는 데이터를 상위에 위치하도록 한다.
(2) 랭킹 알고리즘
대부분의 검색 엔진은 검색 결과에 랭킹 점수를 적용하기 위해 랭킹 알고리즘을 적용한다.
그 중 TF와 IDF는 score을 계산할 때 사용하는 factor이다.
- Term Frequency
- 찾는 검색어가 문서에 많을수록 해당 문서의 정확도가 높다.
- Term Frequency 자체를 socre로 쓴다.
- 분모에 들어간다.
- Inverse Document Frequency
- 전체 문서에서 많이 출현한 (흔한) 단어일수록 점수가 낮다.
- Ex. “많이” 같이 흔한 수식어는 무시한다. 분자에 들어간다.
주로 TF와 IDF를 랭킹 알고리즘으로 많이 쓰지만, ElasticSearch 5.0부터는 BM25 알고리즘을 사용한다.
[ Aggregation ]
여기추가
GET _search
{
"query":
{
"match": {
"FIELD" "~~~" //검색할 것
}
}
}
Aggregation
Elasticsearch는 Query를 통한 검색 기능 이외에 이를 집계해주는 Aggregation의 기능도 제공한다.
Aggregatino은 여러 개의 document를 가지고 우리가 확인하고자 하는 지표(metric)를 뽑는 기능이며 주로 아래와 같이 Query를 작성한다.
GET {검색범위}/_search
{
"query" : {
{검색조건}
},
"aggs" : {
{집계조건}
}
}
- Elasticsearch가 제공하는 Aggregation 기능은 아래와 같다.
- Bucket Aggregation
- Metric Aggregation
- Sibling Pipeline Aggregation
- Parent Pipeline Aggregation
이를 더 자세하게 설명하자면 아래와 같다.
- Bucket Aggregation
- Document를 조건을 통해 여러 개의 Bucket으로 나눈다.
- Histogram : 동일한 interval을 기준으로 Bucket을 나눈다.
- Significant terms : 모집단 대비 샘플링한 집단의 빈도를 가지고 판단한다.
- Metric Aggregation
- Bucket Aggregation 이후에 Bucket 안의 Document를 가지고 1개의 Metric 통계 값을 나타낸다.
- Pipeline Aggregation
- Metric Aggregation 이후에 n개의 metric 통계 값을 1개의 통계 값으로 만든다.
- Sibling : 모든 bucket의 metric aggregation을 모두 가지고 통계 값을 구한다.
- Parent : 일부 bucket의 metric aggregation을 가지고 통계 값을 구한다.