服务器端elasticsearch过滤器

Server-side elasticsearch filters

本文关键字:过滤器 elasticsearch 服务器端      更新时间:2023-09-26

我使用javascript-elasticsearch API来搜索数据。然而,我需要根据他们的工作室限制访问特定的组。例如:

obj1
title = Titanic
studio = Fox
obj2
title = Lion King
studio = Disney

我可以做查询:?q=&studio=disney,但这可以被恶意用户在javascript中调整为q=&studio=。是否有一种方法可以在我使用的API密钥或elasticsearch本身中设置此限制(&studio=X) ?如何做到这一点,如果不能做到,对上述问题的最佳解决方案是什么?

这可以通过过滤别名来完成。其思想是,不是通过索引名称进行搜索,而是通过该索引的过滤别名进行搜索。这里有一个例子。假设您有一个索引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变量,将没有匹配的别名,因此没有返回结果,这是您想要的。