2016-08-10 5 views
0

우리는 사용자가 범주로 나눌 필터 세트와 탄성 검색 결과를 필터링 할 수 있습니다 :Elastic Search 집계를 사용하여 쿼리 필터링 논리를 미러링하는 방법은 무엇입니까? 우리의 사이트에

A 
    A1 
    A2 
    ... 
B 
    B1 
    B2 
    B3 
    ... 

이이처럼 문서의 필드에 나타날 수있는 문자 태그에 일치됩니다

사용자가 선택하면 A1, B1B2, 우리가 (A1 AND B1 AND B2) 기준으로 필터링 할 수 있도록
{ tags: ["A1", "B1", "B2"] } 

우리의 기존 조회는 아래의 모든 필터 조건을 조인합니다.

(A1) AND (B1 OR B2)을 얻을 수 있도록이 항목을 "각 필터 범주 내 OR"및 "AND 범주"로 변경하고 싶습니다.

이제 주름 : "태그"필드에 "용어"집계를 사용하여 다음 필터 적용에서 몇 개의 항목이 다시 나타날지 예측합니다. 용어 집계는 여전히 A1 AND B1 AND B2을 예측하기 때문에

다음
A 
    A1 12 # If the user adds the A1 filter, there'll be 12 results. 
    A2 3 # etc. 
    ... 
B 
    B1 5 
    B2 0 
    B3 2 
    ... 

가, AND에 필터 로직을 변경/OR 다시 "용어"통합에서 오는 수를 나눈 것 같은 우리의 UI에서이 보인다. B3을 추가하면 우리는 A1 AND B1 AND B2 AND B3을 얻게되고 결과에서 실제로 범위를 넓히지 만 (즉, (A1) AND (B1 OR B2 OR B3)) 집계에서 카운트를 좁히게됩니다.

필터링 논리와 집계 횟수가 일치하도록 집계에서이를 표현하는 방법이 있습니까?

답변

2

일반적인 쿼리에서 필터로 사용할 수있는 것을 기반으로 버킷을 구성하는 Filter aggregation을 사용할 수 있습니다. 이것은 "다음"조합마다 하나의 필터 버킷을 정의해야하기 때문에 사전에 필터를 구성 할 수 있고 가능한 값이 너무 많으면 작동 할 수 있습니다. 단순한 Terms aggregation과 비교할 때 성능에 영향을 미칠 수 있습니다. 의 문서를 참조하십시오 자세한 내용은

: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html

+0

재미있는 - 그래서 나는 등 (현재 필터 + A1), (현재 필터 + A2), 각각의 가능한 다음 필터처럼 뭔가를 보내야하는 것 ? 우리는 5 ~ 6 천 개가 넘는 문서를 운영하는 수백 개의 필터를 보유하고 있습니다. – user1454265

+0

내가 말했듯이, 당신이 "다음"필터를 만들 필요가있는 많은 다른 태그 (용어)가있을 때 이것이 좋은 해결책인지 확실하지 않습니다. Elasticsearch는 필터를 캐싱하고 재사용 할 때 큰 역할을하므로 시도해 볼 수는 있습니다. 5 천 6 천 명도 그다지 많은 문서가 아닙니다. 그것은 집계를 구성하고 나중에 수동으로 결과를 추출하는 방법에 관한 것입니다. 아마도 모든 결과를 한 번에 표시하지 않는 방법이있을 것입니다. –

+0

감사합니다.이 접근 방식은 현재 작동하고 있습니다 (ES 1.7). 나는 어딘가에 (우리의 스택에있을 수있는) 어딘가에 부딪혀서 ~ 200 버킷으로 내 필터 집계를 제한하고있다. – user1454265