2013-05-03 9 views
2

누군가가 게시하고이를 수행하는 방법에 대한 예를 들면, Elasticsearch에서 필터링이 작동하는 방식에 관한 거의 모든 질문에 대한 답변을 얻을 수 있습니다.Elasticsearch Complex Filter Logic

A, B, C, D, E 등은 필드이고, a1, a2, ..., b1, b2, ... 등은 해당 필드의 가능한 값입니다. 또한 이러한 필드 중 하나라도 여러 값을 가질 수 있다고 가정합니다.

A = A1 및 (B = B1 OR C = C1) AND ((D = D1) 또는 (D = D2)) AND (((E :

어떻게 아래 논리 필터링 실시합니다 것 = e1) OR (E = e2) AND AND (F = f1) OR ((G = g1) AND (G = g1)) AND (H = h1)

이것은 실제 쿼리가 아닙니다. 글을 쓰려하지만, 쓰고 싶은 모든 쿼리가 있습니다.

저는 A = a1 및 (B = b1 또는 B = b2)를 수행하는 방법을 알고 있습니다. 예를 들어 아래에서 CustomerID = 113 AND (TypeID = 91 또는 TypeID = 70) 인 문서에서 "검색 할 대상"이라는 용어를 찾습니다.

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "something to search" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "term": { 
       "CustomerID": "113" 
      } 
      }, 
      { 
      "or": [ 
       { 
       "terms": { 
        "TypeID": [ 
        91, 
        70 
        ] 
       } 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

그러나 나머지 필터를 조합하는 방법을 고민하는 중입니다.

전체 예제가 최고 일 것입니다!

+0

필터를 사용 하시겠습니까? 이 복잡한 필터는 여러 번 재사용됩니까? 보여준 것과 같은 query_string을 생성하여 검색을 통해 제출할 수 있습니다. '(검색 할 대상) AND (A = a1 AND (B = b1 OR C = c1) AND ((D = d1) OR (D = d2) AND AND ((E = e1) OR (E = e2) AND AND (F = f1) OR)' –

+0

필터가 바람직합니다. 이러한 검색 중 일부는 계속해서 사용되며 나머지는 자주 사용되지 않습니다. 저는 주로 필터가 어떻게 다른 방식으로 결합 될 수 있는지 파악하려고 노력하고 있으며 전체 구조가 어떻게 작동하는지 명확하게 보여주는 예제를 보지 못했습니다. AND 필터, OR 필터 및 BOOL 필터/쿼리의 예를 보았지만 그 중 어떤 것도 함께 재생할 수있는 방법을 보여주기에 충분하지 않았습니다. – CTC

답변

2

이동 방법은 기본적으로 스 니펫에 표시 한 것입니다. 중첩 된 방식으로 AND filtersOR filters을 사용합니다. 예를 들어, 고려 : A=a1 AND (B=b1 OR C=c1). 당신은 할 것이다 :

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "something to search" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "term": { "A": "a1" } 
      }, 
      { 
      "or": [ 
       { 
       "term": { "B": "b1 } 
       }, 
       { 
       "term": { "C": "c1 } 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

내가 프로그래밍이 JSONs을 구성한다고 가정하므로 복잡한 논리 주어진 어려운 것이 아니다는 JSON에 해당하는 필터를 구축합니다.

문제가 논리의 메모리에 해당하는 표현으로 "A=a1 AND (B=b1 OR C=c1)" 같은 입력 텍스트 쿼리를 변환하는 방법을 경우

는, 당신은 단지 query_string 쿼리와 query filter를 사용하여 더 나을 것입니다. 아마도 로직을 수동으로 분석하고 싶지 않을 것입니다.

1

OR 필터에는 하나 이상의 일치해야하는 2 개 이상의 하위 쿼리가 포함되어 있습니다. And 필터는 모두 일치해야하는 2 개 이상의 하위 쿼리를 포함합니다. 그들을 결합하고 중첩하면 많은 사람들이 포착을하게됩니다.

A = a1 AND (B = b1 또는 C = c1) AND ((D = d1) 또는 D = d2) AND ((E = e1) OR (E = E2)) AND (F = F1)) OR (((G = G1) 및 (G = G2)) AND (H = H1))

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "something to search" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "term": { 
       "A": "a1" 
      } 
      }, 
      { 
      "or": [ 
       { 
       "term": { 
        "B": "b1" 
       } 
       }, { 
       "term": { 
        "C": "c1" 
       } 
       } 
      ] 
      }, 
      { 
      "terms": 
       { 
       "D": [ "d1", "d2" ] 
       } 
      }, 
      { 
      "terms": 
       { 
       "E": [ "e1", "e2" ] 
       } 
      }, 
      { 
      "or": [ 
       { 
       "term": { 
        "F": "f1" 
       } 
       }, { 
       "term": { 
        "G": "g1" 
       } 
       } 
      ] 
      }, 
      { 
      "term": 
       { 
       "G": "g2" 
       } 
      }, 
      { 
      "term": 
       { 
       "H": "h1" 
       } 
      } 
     ] 
     } 
    } 
    } 
} 

가 나는 paranteces가 정확한 계산하지만 한 슈어하지 잘만되면 당신은 그림을 본다.

+0

이것은 내가 찾고있는 것입니다. 나는 아직도 약간 혼란 스럽다. 그래서 나와 맺어 라. 예를 들어, A = a1 AND (B = b1 OR C = c1)의 논리가 OR ((G = g1) AND에 사용 된 논리와 동일하다는 것은 나에게 잘못 될 수 있음) (G = g1) AND (H = h1)) AND (H = h1) 다른 식으로 말하자면,)는 실제로 작동합니다 : OR (F = f1 또는 g = g1) AND (G = g2) AND (H = h1). 본질적으로 G = g2 및 H = 1 서브 필터가 최상위 레벨에있는 것처럼 보이지만 실제로는 레벨을 더 깊게 설정해야합니다. 내가 놓친 게 있니? – CTC

+0

그래, 사실 나는 지금 여기서 무슨 일이 벌어지고 있는지 실제로 볼 수 있습니다. 어떤 것을 시험해보고 다시 게시 할 것입니다. 감사, – CTC