我正在尝试创建一种安全过滤器,以排除某些用户在弹性搜索中查看某些文档。例如,如果文档包含“ABC:123”和“ABC:XYZ”,则用户必须在其配置文件中同时拥有这两个文档才能查看该文档。我们正在使用胡子模板动态创建它。我的第一次尝试就是这样:
"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但定期控制更改,而不是手动维护该列表。
假设您的文档如下所示:
{
...
"controlSet": ["ABC:123", "ABC:XYZ"],
...
}
和controlSet
是一个keyword
字段,以下查询应该做的伎俩:
{
"bool": {
"filter": {
"terms": {
"controlSet": ["ABC:123", "ABC:XYZ"]
}
}
}
}
它将与controlSet
文件匹配,至少有ABC:123
和ABC:XYZ
我可能找到了解决方案......
{
"bool": {
"must_not": {
"regexp": {
"value": "ABC:~(XYZ|123)",
"flags": "COMPLEMENT"
}
}
}
}
这应该允许ABC:XYZ或ABC:123(或两者)的文件,同时排除ABC的文件:[其他]
当然我担心正则表达式的速度,但我认为缺少通配符会使它相对较快。