[Elasticsearch] 필터링 쿼리 및 집계(Filtering Queries and Aggregations)
10107 단어 ElasticsearchSearch
검색 및 집합 필터링
A natural extension to aggregation scoping is filtering. Because the aggregation operates in the context of the query scope, any filter applied to the query will also apply to the aggregation. 필터는 집합 작용역의 자연스러운 확장이다.집합은 조회 작용 영역의 상하문에서 작동하기 때문에, 조회에 적용되는 모든 필터도 집합에 적용될 수 있다.
filtered 쿼리
만일 판매 가격이 10000달러보다 높은 모든 차를 찾고 이 차들에 대해 평균 가격을 계산하고 싶다면, filtered 조회를 사용할 수 있다.GET /cars/transactions/_search?search_type=count
{
"query" : {
"filtered": {
"filter": {
"range": {
"price": {
"gte": 10000
}
}
}
}
},
"aggs" : {
"single_avg_price": {
"avg" : { "field" : "price" }
}
}
}
본질적으로 말하자면, Filtered 조회를 사용하는 것과 match 조회를 사용하는 것은 차이가 없다. 우리가 지난 장에서 논의한 바와 같이.이 조회 (필터 포함) 는 문서의 특정한 하위 집합을 되돌려주고 이 하위 집합에서 집합 작업을 합니다.
필터 버킷(Filter Bucket)
만약 당신이 집합 결과만 필터하고 싶다면?만약에 우리가 자동차 거래에 대한 검색 페이지를 만들고 있다면, 우리는 사용자의 검색 내용에 따라 대응 결과를 보여주고 싶다.하지만 우리도 지난달 판매한 자동차의 평균 가격 (검색에 일치하는 자동차) 을 포함해서 페이지를 더욱 풍부하게 하고 싶다.
이 때 우리는 두 가지 다른 검색 조건이 있기 때문에 간단한 작용역을 사용할 수 없다.검색 결과는ford와 일치해야 하지만, 집합 결과는ford와 일치해야 하며, 판매 기간은 지난달입니다.
이 문제를 해결하기 위해서, 우리는 필터라는 특수통을 사용합니다.필터를 만들면 문서가 필터의 규칙과 일치하면 통에 추가됩니다.
다음은 질의입니다.GET /cars/transactions/_search?search_type=count
{
"query":{
"match": {
"make": "ford"
}
},
"aggs":{
"recent_sales": {
"filter": {
"range": {
"sold": {
"from": "now-1M"
}
}
},
"aggs": {
"average_price":{
"avg": {
"field": "price"
}
}
}
}
}
}
필터통이 다른 통과 비슷한 방식으로 작동하기 때문에, 다른 통과 지표를 임의로 포함시킬 수 있다.모든 플러그인 구성은 이 필터를 계승합니다.따라서 당신은 필요에 따라 집합 중의 내용을 필터할 수 있다.
후면 필터(Post Filter)
현재 검색 결과와 집합을 필터하는 필터 (filtered 조회) 가 있고, 집합의 일부분을 필터하는 필터 (filter 통) 도 있습니다.
"검색 결과만 필터하고 집합은 필터하지 않는 필터가 있나요?"이 문제의 답은post_를 사용하는 것이다filter.
이것은 검색 요청 내에서 필터를 매개 변수로 받아들일 수 있는 최상위 요소입니다.이 필터는 조회가 끝난 후에 적용됩니다. (뒤에 붙여진 이름: 조회가 실행된 후에 실행됩니다.)검색이 실행된 후에 실행되기 때문에 검색 작용역에 영향을 주지 않기 때문에 집합에 영향을 주지 않습니다.
이 비헤이비어를 사용하면 검색 조건에 추가 필터를 추가할 수 있으며, 사용자 인터페이스에서 카테고리 페이시스(Categorical Facets)와 같은 요소에 영향을 주지 않습니다.자동차 거래에 대한 또 다른 검색 페이지를 설계합시다.이 페이지는 사용자가 자동차를 검색할 수 있고 색깔에 따라 필터링할 수 있도록 한다.색상은 컬렉션을 통해 제공됩니다.GET /cars/transactions/_search?search_type=count
{
"query": {
"match": {
"make": "ford"
}
},
"post_filter": {
"term" : {
"color" : "green"
}
},
"aggs" : {
"all_colors": {
"terms" : { "field" : "color" }
}
}
}
post_filter 요소는 검색 결과만 필터링하는 최상위 요소입니다.
조회 부분은요?그리고 우리는 하나의 terms 집합에 따라 색 목록을 얻는다.집합은 조회 작용 영역에서 진행되기 때문에, 얻은 색 목록은ford 자동차의 각종 색을 반영할 수 있다.
마지막,post_필터는 검색 결과를 필터링하여 녹색ford 자동차만 표시합니다.이 단계는 조회를 실행한 후에 발생하기 때문에 집합은 영향을 받지 않을 것이다.
이 점은 일치된 사용자 인터페이스를 유지하는 데 매우 중요하다.사용자가 인터페이스에서 분류(예를 들어 녹색)를 클릭했다고 가정하십시오.원하는 결과는 검색 결과가 필터링되고 사용자 인터페이스의 분류 옵션은 변하지 않습니다.만약에 filtered 조회를 사용한다면 사용자 인터페이스에서도 분류를 업데이트할 것입니다. 이때 녹색은 유일한 옵션이 됩니다. - 이것은 분명히 사용자가 원하는 것이 아닙니다!
경고: 성능 고려 사항
검색 결과와 집합에 대해 다른 필터를 사용해야 할 때만post_filter.때때로 일부 사용자는 일반 검색에서post_를 직접 사용합니다filter.
이러지 마!post_필터는 검색 후에 실행되기 때문에 성능에 대한 필터링 (예를 들어 캐시) 을 잃게 됩니다.
post_필터는 집합과 함께 사용해야 하며, 필터 조건이 다를 때만 사용해야 합니다.
총결산
적합한 유형의 필터 - 검색 결과(Search Hits), 집합(Aggregations) 또는 둘 다를 선택하는 것은 사용자 인터페이스의 행동에 달려 있습니다.필터의 선택 (또는 조합) 은 사용자에게 결과 데이터를 어떻게 보여주느냐에 달려 있습니다.
GET /cars/transactions/_search?search_type=count
{
"query" : {
"filtered": {
"filter": {
"range": {
"price": {
"gte": 10000
}
}
}
}
},
"aggs" : {
"single_avg_price": {
"avg" : { "field" : "price" }
}
}
}
GET /cars/transactions/_search?search_type=count
{
"query":{
"match": {
"make": "ford"
}
},
"aggs":{
"recent_sales": {
"filter": {
"range": {
"sold": {
"from": "now-1M"
}
}
},
"aggs": {
"average_price":{
"avg": {
"field": "price"
}
}
}
}
}
}
GET /cars/transactions/_search?search_type=count
{
"query": {
"match": {
"make": "ford"
}
},
"post_filter": {
"term" : {
"color" : "green"
}
},
"aggs" : {
"all_colors": {
"terms" : { "field" : "color" }
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Embulk를 사용하여 ElasticCloud로 보내기Embulk에서 ElasticCloud에 보낼 수 있을까라고 생각비망록도 겸해 기술을 남깁니다 Embulk 설치 ElasticCloud (14 일 체험판) brew라면 아래 명령 입력 파일 만들기 파일 내용 seed...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.