Vespa搜索链内部调用触发循环问题求助
解决方案
1. 绕过自定义搜索链,直接执行原生Vespa查询
在SearchInVespa的搜索方法中,不要使用当前Execution对象的search()方法,而是直接构造原生搜索请求并调用Vespa容器的搜索接口,彻底绕过自定义链的触发逻辑。示例代码如下:
@Override public Result search(Query query, Execution execution) { // 构造针对特定schema的独立查询 Query internalVespaQuery = new Query("select * from your_target_schema where ..."); internalVespaQuery.getModel().setSchema("your_target_schema"); // 获取容器的搜索服务,直接执行原生查询 SearchResponse response = execution.getContext().getContainer().getComponent(Search.class).search(internalVespaQuery); // 将原生结果转为自定义Result的hits返回 Result result = new Result(query); result.hits().addAll(response.getHits().asList()); return result; }
2. 配置专属内部搜索链
在services.xml中定义一个仅包含Vespa原生搜索组件的独立搜索链,避免触发你的自定义链逻辑:
<container id="default" version="1.0"> <!-- 你的自定义搜索链 --> <searchchain id="custom-integration-chain"> <searcher id="com.yourcompany.GetUserQueryPackageResult"/> <searcher id="com.yourcompany.SearchInVespa"/> <searcher id="com.yourcompany.SearchInNeo4J"/> </searchchain> <!-- 内部Vespa查询专用链 --> <searchchain id="internal-vespa-only-chain"> <searcher id="com.yahoo.search.query.QueryPreparer"/> <searcher id="com.yahoo.search.searchchain.SearchNode"/> <!-- 按需添加其他原生搜索组件,比如排序、过滤等 --> </searchchain> </container>
之后在SearchInVespa中指定使用这个内部链执行查询:
@Override public Result search(Query query, Execution execution) { Query internalQuery = new Query("select * from your_target_schema where ..."); // 指定使用内部专用链 internalQuery.getContext().put("searchchain", "internal-vespa-only-chain"); // 通过ExecutionFactory创建该链的执行实例 Execution internalExecution = execution.getContext().getComponent(ExecutionFactory.class).createExecution("internal-vespa-only-chain"); Result internalResult = internalExecution.search(internalQuery); // 处理结果后返回给上一级 Result result = new Result(query); result.hits().addAll(internalResult.hits().asList()); return result; }
3. 隔离查询上下文参数
创建内部查询时,清除继承自当前请求的上下文参数,确保不会意外触发自定义链:
Query internalQuery = new Query("select * from your_target_schema where ..."); // 清空上下文,避免携带当前链的标识 internalQuery.getContext().clear(); // 手动设置必要的参数,比如schema internalQuery.getModel().setSchema("your_target_schema");
内容的提问来源于stack exchange,提问作者Kalyan
相关产品推荐
相关产品推荐

