2017-12-19 5 views
0

elasticsearch에서 특정 문서를 보지 못하도록 특정 사용자를 제외시키는 보안 필터를 만들려고합니다. 예를 들어, 문서에 "ABC : 123"및 "ABC : XYZ"가 포함되어있는 경우 사용자는 해당 문서를보기 위해 프로필에있는 두 가지 모두 있어야합니다. 우리는 콧수염 주머니를 사용하여 파리에서 이것을 만들고 있습니다. 내 첫 번째 시도는 다음과 같습니다.elasticsearch에서 보안 필터 만들기

"bool": { 
    "filter": { 
     "bool": { 
      "minimum_should_match": 1, 
      "should": { 
       "bool": [{ 
        "must_not": { 
         "prefix": { 
          "controlSet": "ABC:" 
         } 
        } 
       },{ 
        "must": { 
         "terms": { 
          "controlSet": ["ABC:123","ABC:XYZ"] 
         } 
        } 
       }] 
      } 
     } 
    } 
} 

그러나 한 명의 사용자가 여러 명의 문서를 볼 수있게되었습니다. 문서에는 사용자가 일치시켜야하는 컨트롤의 하위 집합이 있어야합니다. 따라서 사용자에게 "ABC : XYZ"가있는 경우에만 문서에 "ABC : XYZ"가 포함되어 있어도 "ABC : 123"이있는 문서를 볼 수 없어야합니다.

실종 신고 방법은 있습니까? 현재 우리는 시스템에서 제어를 열거하고이를 must_not에 추가하지만 주기적으로 변경을 제어하므로 목록을 수동으로 관리하지 않을 것입니다.

답변

0

나는 해결책을 발견했을 수도 있습니다. .

ABC 중 하나와 문서 허용해야
{ 
    "bool": { 
     "must_not": { 
      "regexp": { 
       "value": "ABC:~(XYZ|123)", 
       "flags": "COMPLEMENT" 
      } 
     } 
    } 
} 

: XYZ 또는 ABC : 123 (또는 둘 다) ABC와 문서를 제외하면서 [아무것도] 물론

을 나는 정규 표현식의 속도에 대한 걱정을 와일드 카드가 없다면 상대적으로 빠를 것이라고 생각합니다.

0

가정 문서처럼 보이는 다음

{ 
    ... 
    "controlSet": ["ABC:123", "ABC:XYZ"], 
    ... 
} 

controlSet을하는 keyword 필드 트릭해야 다음 쿼리 :

{ 
    "bool": { 
     "filter": { 
      "terms": { 
       "controlSet": ["ABC:123", "ABC:XYZ"] 
      } 
     } 
    } 
} 

그것은 controlSet은 적어도 갖는 문서를 일치를 및 ABC:XYZ

+0

'controlSet': [ "ABC : 123"]'도 일치한다는 문제가 있습니다. 사용자가 문서에있는 컨트롤의 수퍼 셋을 갖도록 강제 할 수있는 방법이 필요합니다. – Derek