服务器端弹性搜索过滤器

时间:2015-10-24 23:47:21

标签: javascript elasticsearch elasticjs

我使用javascript-elasticsearch API搜索数据。但是,我需要根据他们的工作室限制对某个群组的访问。例如:

obj1
title = Titanic
studio = Fox

obj2
title = Lion King
studio = Disney

我可以执行查询:?q=&studio=disney,但这可以在恶意用户的javascript中进行调整以执行q=&studio=。有没有办法在我正在使用的API密钥或弹性搜索本身中设置此限制(&studio=X)?如何做到这一点,如果不能做到,那么上述问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

这可以使用filtered alias来完成。我们的想法是,不是通过索引名称进行搜索,而是通过该索引上的筛选别名进行搜索。这是一个例子。我们假设您的索引movies的类型为movie。最基本的搜索方式是:

curl -XPOST localhost:9200/movies/movie/_search?q=...

以这种方式搜索时,您基本上可以访问整个电影索引。如果要将对该索引的某些文档的访问权限限制为某些类型的用户,则可以创建一个别名,该别名仅查询与特定过滤器匹配的文档,如下所示:

curl -XPOST localhost:9200/_aliases -d '{
    "actions" : [
        {
            "add" : {
                 "index" : "movies",
                 "alias" : "disney_movies",
                 "filter" : { "term" : { "studio" : "disney" } }
            }
        }
    ]
}'

然后,您可以强制搜索该别名而不是索引。这样做将透明地仅使用studio: disney搜索电影,并且您不需要在查询本身中明确指定该电影。

curl -XPOST localhost:9200/disney_movies/movie/_search?q=...

如果有人试图篡改studio变量,则没有匹配的别名,因此没有结果返回,这就是你想要的。