[2021.05.25] 인턴 +85 elasticsearch Query DSL search in index (aggregation,복합쿼리 등)
이 게시글은, 데이터들을 인덱스(db로 따지면, 스키마 = 데이터베이스)를 만들어,
해당 인덱스에 "필드" 의 값을 가지고 있는지 검색하는 방법을 알려주기 위해 작성할 것이다.
e.g. index-name : lol_champion, field: "attackspeed" (각각의 롤 챔피언들의 공격속도들을 검색)
----------------------------------------------------------------------------------------------------
logstash를 통하여, indexname: 210521_apache_3gb 데이터를 넣었다.(넣는과정은 다른 게시글에 작성됨)
<원하는 필드와 값을 검색하는 방법>
POST 210521_apache_3gb/_search/
{
"query":{
"match" : {
"geoip.timezone" : "Asia/Tehran"
}
}
}
* "query" : { "match" : { "필드" : "검색할 값" } }
-> took (검색된 갯수) : 1224개가 검색되었다.
<복합 쿼리 사용해서 검색>
bool -> AND 조건 (must) 으로 geoip.timezone에 Asia/Tehran를 포함하면서, geoip.city_name 필드에 Tehran를 검색
POST 210521_apache_3gb/_search/
{
"query":{
"bool": {
"must" : [
{
"match" : {
"geoip.timezone" : "Asia/Tehran"
}
},
{
"match" : {
"geoip.city_name": "Tehran"
}
}
]
}
}
}
<elasticsearch Query DSL 애그리게이션(Aggregations)>
* 이미 인덱싱되어 있는 데이터에 대해서 검색 및 분석
* size : 0
-> 실제로 검색 결과를 다 리턴받을 필요가 없기 때문에 분석 결과만 받도록 하기위함.
* aggs에서 country_name 필드에 대해서 Cardinality 분석을 실행
즉, 중복되지 않은 각각의 country_name개수를 세도록 하는 Aggregations
결과를 보면 10000개의 데이터에서 0개가 있다는 것을 알 수 있음
POST 210521_apache_3gb/_search/
{
"size":0,
"aggs" : {
"total play" : {
"cardinality" : {
"field" : "country_name"
}
}
}
}
<"GROUP BY"와 비슷한 기능인 Terms Aggregation>
POST 210521_apache_3gb/_search
{
"size":0,
"aggs" : {
"Popular plays" : {
"terms" : {
"field" : "geoip.city_name.keyword"
}
}
}
}
-> 중복되는 값을 그룹지어, 몇개나 저장된지 알 수 있습니다.
<다중 애그리게이션 사용>
POST 210521_apache_3gb/_search
{
"size":0,
"aggs" : {
"Popular plays" : {
"terms" : {
"field" : "geoip.city_name.keyword"
},
"aggs" : {
"Per type" : {
"terms" : {
"field" : "_type"
}
}
}
}
}
}
댓글