java - Solr Custom RequestHandler - 注入(inject)查询参数

标签 java solr requesthandler

简短的问题: 我正在寻找一种方法 (java) 来拦截对 Solr 的查询并注入(inject)一些由我的业务逻辑提供的额外过滤参数。我应该使用什么结构?

上下文: 首先,坦白一点:我是 Solr 的菜鸟。对我来说,设置一个服务器,定义一个模式,编写一个功能索引管理器,然后实际看到服务器返回正确的结果 - 完全符合预期! - 本身就已经是很大的成就了。耶我!

但是,我目前从事的企业项目要求的远不止于此。大致来说,solr实例是通过同一个requestHandler被数千个用户查询的,因为返回的文档会根据用户的权限级别自动过滤。例如,如果用户 A 和 super 用户 B 都尝试了完全相同的搜索参数(甚至是完全相同的 url),则用户 B 将获得用户 A 的所有文件,然后还会获得更多。为了实现这一点,文档已经用必要的权限级别信息编入索引。

嗯,考虑到这一点并利用 Solr 为新手开发人员提供的大量文档,我尝试提出一个简单的自定义 requestHandler,它覆盖 handleRequest 函数,以便在 SolrQueryRequest 中注入(inject)必要的额外参数。一切都很好,花花公子——除了我在 QueryResponse 中根本看不到任何区别,服务器粗鲁地忽略了我的小操作。在网上搜索几天后,没有太多关于天气的提示,如果这是最好的方法,最后决定上来打扰 StackOverflow 的好人。

所以,简而言之,我的问题是:

  • 这是正确的方法吗?还有其他选择吗?我已经掌握了 Solr 的一些概念,但不可否认还有很多不足,而且完全有可能遗漏一些东西。

  • 如果是这样,在修改查询参数后,我应该做些什么来强制更新 QueryResponse?据我所知,这些只是封装了 http 请求,并且在进行修改后我无法嗅探任何查询服务器的内容。

提前致谢,非常抱歉发了这么长的帖子!

更新

在大量阅读 API 以及特别是反复试验之后,我设法获得了一个实用的解决方案。然而,我仍然无法理解 Solr 的大部分内部结构,因此仍然希望得到一些启发。随意随意抨击,我仍然非常清楚我的菜鸟。

解决方案的相关部分是这个函数,它由覆盖的 handleRequestBody 调用:

private void SearchDocumentsTypeII(SolrDocumentList results,
        SolrIndexSearcher searcher, String q, 
        UserPermissions up, int ndocs, SolrQueryRequest req,
        Map<String, SchemaField> fields, Set<Integer> alreadyFound)
        throws IOException, ParseException {


         BooleanQuery bq = new BooleanQuery();
         String permLvl = "PermissionLevel:" + up.getPermissionLevel();
         QParser parser = QParser.getParser(permLvl, null, req);
         bq.add(parser.getQuery(), Occur.MUST);

         Filter filter = CachingWrapperFilter(new QueryWrapperFilter(bq));   

         QueryParser qp = new QueryParser(q, new StandardAnalyzer());
         Query query =  qp.parse(q);                        

         append (results, searcher.search(
          query, filter, 50).scoreDocs,
          alreadyFound, fields, new HashMap<String,Object>(), 0,
          searcher.getReader(), true);

基本上不会以任何方式修改搜索查询,而是应用包含用户 PermissionLevel 的过滤器。即便如此,为什么以下替代方案不起作用?搜索查询在标准 requestHandler 中应用时完美运行,而在这种情况下它根本不会命中任何文档。

private void SearchDocumentsTypeII(SolrDocumentList results,
        SolrIndexSearcher searcher, String q, 
        UserPermissions up, int ndocs, SolrQueryRequest req,
        Map<String, SchemaField> fields, Set<Integer> alreadyFound)
        throws IOException, ParseException {

         String qFiltered = q + " AND " + "PermissionLevel:" + up.getPermissionLevel();                              

         QueryParser qp = new QueryParser(qFiltered, new StandardAnalyzer());
         Query query =  qp.parse(qFiltered);                        

         append (results, searcher.search(
          query, null, 50).scoreDocs,
          alreadyFound, fields, new HashMap<String,Object>(), 0,
          searcher.getReader(), true);

最佳答案

好消息:您不需要编写任何代码来执行此操作,您只需正确配置 Solr。 super 用户将点击标准请求处理程序,而普通用户将点击另一个配置有 invariant 的请求处理程序(也是 solr.StandardRequestHandler)使用您想强加给他们的过滤器查询。

另见 http://wiki.apache.org/solr/SolrRequestHandler

关于java - Solr Custom RequestHandler - 注入(inject)查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6182183/

相关文章:

java - 在托管 bean 中传递表单值

jquery - 自动完成和 Solr

java - 在 SOLR 中创建集合

python - 通过 webapp2 处理程序处理 GAE BlobStore 异常

java - 将非 osgi jar 添加到 RCP4 项目

java - 无法创建安全的 XMLInputFactory

java - 在 Tomcat 上运行 SolrCloud 时出现 FileNotFoundException

java - Java中如何查找可以处理特定数据的类?

java - 如何在jsp、java和js代码中处理连续页面刷新