Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义Solr组件插件中的查询构造_Solr - Fatal编程技术网

自定义Solr组件插件中的查询构造

自定义Solr组件插件中的查询构造,solr,Solr,我开发了一个solr组件,它扩展了用户查询并向查询中添加了附加子句。对于此扩展,我们向外部REST api发出请求。此查询扩展逻辑主要在prepare()方法中。在独立模式下,一切正常。当我们在SolrCloud环境中部署这个插件时,每个shard都在调用外部restapi进行查询扩展 我的问题是,我们只能对外部RESTAPI进行一次调用,因为从每个碎片发送到外部服务的请求是相同的。我们如何修改组件,使每个搜索请求只进行一次调用?您可以使用的方法如下: 将组件重写到requestHandler

我开发了一个solr组件,它扩展了用户查询并向查询中添加了附加子句。对于此扩展,我们向外部REST api发出请求。此查询扩展逻辑主要在prepare()方法中。在独立模式下,一切正常。当我们在SolrCloud环境中部署这个插件时,每个shard都在调用外部restapi进行查询扩展


我的问题是,我们只能对外部RESTAPI进行一次调用,因为从每个碎片发送到外部服务的请求是相同的。我们如何修改组件,使每个搜索请求只进行一次调用?

您可以使用的方法如下:

  • 将组件重写到requestHandler中(或仅将其包装在标准requestHandler上)
  • 让您的requestHandler知道将触发/不触发您自己的自定义逻辑的特殊标志。我的意思是这样的(我知道这不是幻想):

  • 在我看来,这些额外的查询子句以及与查询本身相关的所有内容都应该由您自己的
    QParserPlugin
    处理。但组件也可以处理这些子句
在prepare()方法中,就在外部API调用之前,您可以检查
RequestBuilder.isDistrib()
。对于即将分发的请求,此布尔值为true。然后,您可以使用此信息确定是否可以只执行外部请求,还是需要设置执行此任务的SolrCloud主机之一

如何确定用于外部API的SolrCloud主机?你可以

  • 将其中一个主机硬连线到组件中,并检查localhost是否为硬连线主机。不过,这会使主机负载失衡
  • 具有任意测量值,任何组件都可以自行检查,如主机1-10在当前分钟数等于主机数时触发外部请求
  • 甚至在搜索前端掷骰子,通过查询参数将主机名提供给Solr,并让组件根据本地主机名检查此参数(从ResponseBuilder.req.getParams()获取)
  • 你可以在那里获得真正的创造力
从外部API获得答案后,可以使用
modifyRequest()
更新结果中的所有其他主机

请阅读更多的文章

public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
    ...
    SolrParams params = req.getParams();
    if (req.getParams().get("apiCallWasSent") == null) {
        makeApiCall(req, rsp);
        params = new ModifiableSolrParams(params);
        params.add("apiCallWasSent", "true");
        req.setParams(params);
    }
    ...
    super.handleRequestBody(req, rsp);
}