elasticsearch - 如何编写 elasticsearch 插件来扩展/_search 端点?

标签 elasticsearch elasticsearch-plugin elasticsearch-5

我正在使用 ES 5.1.2,我想为每个/_search 请求进行一些简单的身份验证 key 查找。
我在elastic.co上没有找到非常详细的插件开发指南,目前我找到的唯一文档是这个http://david.pilato.fr/blog/2016/10/19/adding-a-new-rest-endpoint-to-elasticsearch-updated-for-ga/ ,但它是关于创建另一个端点。

我找到了 search-guard https://github.com/floragunncom/search-guard从源代码感觉我可以创建自己的插件extends Plugin implements ActionPlugin ,但后来我被卡住了,不知道该去哪里。

从源代码中我知道我可以添加自己的ActionFilter并将其添加到 Plugin 中的操作链中, 这样所有请求都通过 /_search端点也将通过我的ActionFilter .但我没有可能的操作的完整列表,可能是 indices:data/read/search (搜索)或 indices:admin/delete (删除索引)。有太多使用尝试和错误。

另一件事是,在 ActionFilter , 如何从 Request 获取 POST 请求有效负载目的?在 /_search 时请求,我得到了 SearchRequest ,但它没有来自浏览器的 http 请求 header 。

== 更新 ==

发现我可以使用堆栈跟踪来获取调用历史记录,所以对于 ActionFilter调用堆栈就像

at org.elasticsearch.action.support.TransportAction$RequestFilterChain.proceed(TransportAction.java:171)
at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:145)
at org.elasticsearch.action.support.TransportAction.execute(TransportAction.java:87)
at org.elasticsearch.client.node.NodeClient.executeLocally(NodeClient.java:75)
at org.elasticsearch.client.node.NodeClient.doExecute(NodeClient.java:64)
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
at org.elasticsearch.client.support.AbstractClient.search(AbstractClient.java:530)
at org.elasticsearch.rest.action.search.RestSearchAction.lambda$prepareRequest$0(RestSearchAction.java:83)
at org.elasticsearch.rest.action.search.RestSearchAction$$Lambda$1405/1241306571.accept(Unknown Source)
at org.elasticsearch.rest.BaseRestHandler.handleRequest(BaseRestHandler.java:82)

RestSearchAction#prepareRequest , ES 使用 parseSearchRequest并转换 RestRequest数据到 SearchRequest ,这意味着我无法获得 RestRequest在我的ActionFitler .是否应该有另一种方式来传递这些数据?因为我想扩展一个已存在的 /_search不添加另一个端点,所以我认为我不应该再创建 RestHandler

最佳答案

我找到了一个临时解决方案,源代码是here .

长话短说,当你的插件实现为 RestHandler (通常使用新端点),您可以跳过 registerHandlerregisterFilter只要。我在 RestFilter 中实现我的逻辑.这是有效的,因为在 ElasticSearch source code , 当 RestController收到一个新请求,它会检查你是否有任何 RestFilter ,如果你这样做,那么它将通过整个过滤器链,然后根据请求 URI 分派(dispatch)到特定的处理程序。

search guard 5似乎有一种方法可以直接注册 RestFilterRestController不创建 RestHandler ,但我不了解整个流程,所以我没有使用它。

我的主要引用资料:

  • http://david.pilato.fr/blog/2016/10/19/adding-a-new-rest-endpoint-to-elasticsearch-updated-for-ga/
  • https://github.com/floragunncom/search-guard/tree/es-5.1.2
  • 关于elasticsearch - 如何编写 elasticsearch 插件来扩展/_search 端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844991/

    相关文章:

    elasticsearch - 在查询Elasticsearch中访问字段文档

    elasticsearch - 使用Elastic在Webshop中进行分面搜索

    elasticsearch - 为什么他们对elasticsearch中bool查询的最大子句数有限制

    elasticsearch - 如何检测何时将新的唯一术语插入到 Elasticsearch 中特定索引中特定字段的索引中?

    elasticsearch - Elasticsearch 行到列

    elasticsearch - Elasticsearch中的聚合和排序

    Elasticsearch 相当于具有多个字段的 SQL In Query

    elasticsearch - Elasticsearch 存储:如何获取_source下的字段名称列表?

    elasticsearch mapping tokenizer 关键字以避免拆分 token 并启用通配符

    java - 用于 Elasticsearch 的RestClient