[Elasticsearch] 필터링 쿼리 및 집계(Filtering Queries and Aggregations)

10107 단어 ElasticsearchSearch
이 장은 Elasticsearch 공식 안내서의 Filtering Queries and Aggregations 장에서 번역되었습니다.

검색 및 집합 필터링


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) 또는 둘 다를 선택하는 것은 사용자 인터페이스의 행동에 달려 있습니다.필터의 선택 (또는 조합) 은 사용자에게 결과 데이터를 어떻게 보여주느냐에 달려 있습니다.
  • A filtered query affects both search results and aggregations.filtered 조회는 검색 결과와 집합에 영향을 줄 수 있습니다
  • 필터통은 집합에만 영향을 미친다..
  • post_filter는 검색 결과에만 영향을 미칩니다
  • 좋은 웹페이지 즐겨찾기