우리의 데이터는 MongoDB 2.4.8에 저장되고 ElasticSearch MongoDB River 1.7.3을 사용하여 ElasticSearch 0.90.7로 인덱싱됩니다.ElasticSearch : 깊게 중첩 된 데이터에 대한 필터링
데이터 색인이 올바르게 색인되어 있으며 검색하려는 필드를 성공적으로 검색 할 수 있습니다. 그러나 나는 또한 허가를 받아 들일 필요가있다. 물론 호출 사용자가 실제로 읽을 수있는 결과 만 반환하기를 원할 뿐이다. 우리 서버의 코드에서
, 내가 예를 들어, 배열로 호출하는 사용자의 권한을 가지고
는[ "Role:REGISTERED_USER", "Account:52c74b25da06f102c90d52f4", "Role:USER", "Group:52cb057cda06ca463e78f0d7" ]
우리가 검색하는 단위 데이터의 예는 다음과 같습니다
{
"_id" : ObjectId("52dffbd6da06422559386f7d"),
"content" : "various stuff",
"ownerId" : ObjectId("52d96bfada0695fcbdb41daf"),
"acls" : [
{
"accessMap" : {},
"sourceClass" : "com.bulb.learn.domain.units.PublishedPageUnit",
"sourceId" : ObjectId("52dffbd6da06422559386f7d")
},
{
"accessMap" : {
"Role:USER" : {
"allow" : [
"READ"
]
},
"Account:52d96bfada0695fcbdb41daf" : {
"allow" : [
"CREATE",
"READ",
"UPDATE",
"DELETE",
"GRANT"
]
}
},
"sourceClass" : "com.bulb.learn.domain.units.CompositeUnit",
"sourceId" : ObjectId("52dffb54da06422559386f57")
}
]
}
위의 샘플 데이터에서 검색 가능한 모든 콘텐츠를 "content" : "various stuff"
으로 바 꾸었습니다. 인증 데이터는 "acls"ar 레이. 나는 (영어로) 다음을 수행 할 작성할 필요가 필터 : 권한 부여 및 본 기기가있는 accessMap 있습니다 위의 예에서
pass all units where the "acls" array
contains an "accessMap" object
that contains a property whose name is one of the user's authorization strings
and whose "allow" property contains "READ"
and whose "deny" property does not contain "READ"
, 사용자는 "사용자 역할"을 가지고 "역할 : 사용자를" , "READ"및 "Role : USER"가 포함 된 "allow"가 들어있는 파일에는 "deny"가 없습니다. 그래서이 유닛은 필터를 통과 할 것입니다.
ElasticSearch를 사용하여 필터를 작성하는 방법이 표시되지 않습니다.
"중첩 된"또는 "has_child"(또는 "has_parent")와 같이 중첩 된 배열을 처리하는 두 가지 방법이 있다는 인상을받습니다.
"중첩 된"필터는 데이터가 변경 될 때 전체 블록을 다시 인덱싱해야하기 때문에 꺼려합니다. 검색 가능한 컨텐츠 및 권한 부여 데이터는 사용자 조치에 따라 언제든지 변경 될 수 있습니다.
"has_child"또는 "has_parent"를 사용하려면 권한 부여 데이터가 다른 컬렉션의 유닛 데이터와 분리되어 있어야하며 노드가 인덱싱되면 부모 또는 자녀를 지정해야합니다. 나는 ElasticSearch MongoDB River가 이것을 할 수 있는지 여부를 모른다.
이렇게해도 될까요? 또는 승인 데이터를 재 배열해야합니까?
서로 다른 액세스 수준에 대해 별도의 색인을 사용하고 ES 상단의 프록시에 대한 액세스 제어를 강화할 것입니다. – opyate