Arrays ElasticSearch中的权限
给出一组类似于以下内容的文件:Arrays ElasticSearch中的权限,arrays,
elasticsearch,intersection,Arrays,
elasticsearch,Intersection,给出一组类似于以下内容的文件: { "value": "Some random string here", "permissions": ["job.view", "special.permission"] } 我们希望能够创建一个搜索,允许我们传递一组权限来匹配,例如,我们可能希望传入 ["job.view", "foo.bar", "pineapple.eat"] 作为权限 仅当文档中列出的所有权限都存在于作为查询一部分传入的集合中时,该文档才应在搜索中返回 不管我们是否
{
"value": "Some random string here",
"permissions": ["job.view", "special.permission"]
}
我们希望能够创建一个搜索,允许我们传递一组权限来匹配,例如,我们可能希望传入
["job.view", "foo.bar", "pineapple.eat"]
作为权限
仅当文档中列出的所有权限都存在于作为查询一部分传入的集合中时,该文档才应在搜索中返回
不管我们是否需要更改文档布局或查询,我们都不会大惊小怪,但是,由于AWS的原因,我们目前仅限于无法使用脚本API。有一种复杂的方法可以做到这一点,它还要求您为文档中的权限数编制索引,也就是说,如果文档在
permissions
数组中包含两个值(如您的示例中),那么您还应该包括permissions\u count:2
字段
然后,您的查询将包含与搜索数组中的权限排列一样多的bool/should
查询。例如,在搜索数组中,您有3个权限[“job.view”、“foo.bar”、“菠萝.eat”]
,然后您需要检查以下条件:
权限
包含所有三个权限和权限\u计数:3
permissions
包含三种权限中的两种(三种组合)和permissions\u count:2
permissions
仅包含三种权限中的一种(三种可能性)和permissions\u count:1
bool/should
中将有1个查询。对于2个权限,您将有3个,对于3个权限,您将有7个,以此类推
完整查询如下所示:
{
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"terms": {
"permissions": ["job.view", "special.permission", "pineapple.eat"]
}
},
{
"term": {
"permissions_count": 3
}
}
]
}
},
{
"bool": {
"must": [
{
"terms": {
"permissions": ["special.permission", "pineapple.eat"]
}
},
{
"term": {
"permissions_count": 2
}
}
]
}
},
{
"bool": {
"must": [
{
"terms": {
"permissions": ["job.view", "pineapple.eat"]
}
},
{
"term": {
"permissions_count": 2
}
}
]
}
},
{
"bool": {
"must": [
{
"terms": {
"permissions": ["special.permission", "job.view"]
}
},
{
"term": {
"permissions_count": 2
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"permissions": "special.permission"
}
},
{
"term": {
"permissions_count": 1
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"permissions": "job.view"
}
},
{
"term": {
"permissions_count": 1
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"permissions": "pineapple.eat"
}
},
{
"term": {
"permissions_count": 1
}
}
]
}
}
],
"minimum_number_should_match": 1
}
}
}
正如您所见,仅检查三个权限有点复杂
我可能会从另一个角度来处理这个问题,并提出另一个字段(或字段集),该字段将包含权限的位集或为每个权限巧妙选择的整数,但我还没有完全考虑到这一点
另一种解决方案是利用屏蔽和文档访问控制,而不是将权限存储在文档本身中。只是澄清一下,您的查询中必须存在文档中的所有
权限?即使您向[“job.view”、“foo.bar”、“菠萝.eat”、“random”、“random.more”、“much.more.random”]
添加随机内容,它仍然会通过?因此,例如,上面的查询与示例文档不匹配,因为它没有特殊.permission
。添加special.permission
将使其通过(即使它还包含foo.bar
和菠萝.eat
)。因此,是的,即使查询中有额外的内容,它也会通过100%的文档权限必须在查询中,但查询可以包含文档中不存在的额外权限。解决方案与非常类似,只是因为没有子数组,所以更容易。您不需要迭代子数组,只需检查权限
数组和您的搜索数组之间的交集是否与权限
数组具有相同的长度。@Val无需编写脚本就可以执行此操作吗?这与我的要求不符。我们发送的权限可以是一个包含100个权限的列表,我们只想在文档中的所有项目都存在于这100个权限中时返回。有点像一个should,但它的最小匹配项设置为文档中的权限计数。您的查询似乎必须排列每个组合?位集是一个选项,但我们可能有超过32/64的权限。是的,这就是为什么我使用形容词卷积!如果不使用脚本和简单地索引权限字符串数组,恐怕没有太多的选项。位集不限于32/64权限,它只取决于您选择的位数;)你有没有研究过屏蔽和文档权限?但是给它们分配数字/在64:)之后做数学(假设是单数)会很尴尬。而且-我简单地看了一下shield-据我所知,它不能直接与AWS的东西一起工作-所以我们可以设置我们自己的ES服务器,我们可以在其上执行脚本编写?没有简单的解决方案可以在集合上执行操作(这基本上是权限匹配所需的)。