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
Java Solr Custom RequestHandler-注入查询参数_Java_Solr_Requesthandler - Fatal编程技术网

Java Solr Custom RequestHandler-注入查询参数

Java Solr Custom RequestHandler-注入查询参数,java,solr,requesthandler,Java,Solr,Requesthandler,简短问题: 我正在寻找一种方法(java)来截取对Solr的查询,并注入一些由我的业务逻辑提供的额外过滤参数。我应该使用什么结构 背景: 首先,有点坦白:我对索尔是个新手。对我来说,设置一个服务器,定义一个模式,编写一个功能性indexmanager,然后实际看到服务器返回正确的结果——完全按照预期这本身已经是一个很大的成就。哎呀 然而,我目前正在一个企业项目中工作,需要的不仅仅是这些。粗略地说,solr实例将由数千名用户通过相同的requestHandler进行查询,因为返回的文档将根据用户的

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

背景: 首先,有点坦白:我对索尔是个新手。对我来说,设置一个服务器,定义一个模式,编写一个功能性indexmanager,然后实际看到服务器返回正确的结果——完全按照预期这本身已经是一个很大的成就。哎呀

然而,我目前正在一个企业项目中工作,需要的不仅仅是这些。粗略地说,solr实例将由数千名用户通过相同的requestHandler进行查询,因为返回的文档将根据用户的权限级别自动过滤。例如,如果用户A和超级用户B都尝试了非常相同的搜索参数(甚至是非常相同的url),那么用户B将获得用户A的所有文件,然后获得更多文件。为了实现这一点,文档已经使用必要的权限级别信息编制了索引

考虑到这一点,并利用Solr为新手开发人员提供的大量文档,我试图提出一个简单的定制requestHandler,它重写HandlerRequest函数,以便在SolrQueryRequest中注入必要的额外参数。一切都很好,很漂亮——除了我从来没有在QueryResponse中看到任何区别,服务器粗暴地忽略了我的小操作。在网上搜索了几天之后,如果这是最好的方法,没有那么多的天气提示,最后决定来打扰StackOverflow的好朋友

简言之,我的问题是:

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

  • 如果是这样,在修改查询参数之后,我是否应该做些什么来强制更新QueryResponse?据我所知,这些只是封装http请求,在修改之后,我无法嗅到任何查询服务器的信息

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

更新 经过大量的API阅读,特别是反复尝试,我终于找到了一个功能性的解决方案。然而,我仍然无法理解Solr的许多内部内容,因此,我仍然希望得到一些启发。可以随意抨击,我仍然很清楚我的新秀

解决方案的相关部分是由重写的HandlerRequestBody从调用的此函数:

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);
private void searchdocumentsYPEII(SolrDocumentList结果,
SolrIndexSearcher搜索器,字符串q,
UserPermissions up,int ndocs,SolrQueryRequest req,
映射字段,设置alreadyFound)
抛出IOException,ParseException{
BooleanQuery bq=新的BooleanQuery();
字符串permLvl=“PermissionLevel:+up.getPermissionLevel();
QParser parser=QParser.getParser(permLvl,null,req);
add(parser.getQuery(),occure.MUST);
过滤器过滤器=CachingWrapperFilter(新查询过滤器(bq));
QueryParser qp=新的QueryParser(q,新的StandardAnalyzer());
Query=qp.parse(q);
附加(结果,searcher.search)(
查询,筛选,50)。计分单,
alreadyFound,字段,新HashMap(),0,
searcher.getReader(),true);
}

基本上,不会以任何方式修改搜索查询,而是应用包含用户权限级别的筛选器。即便如此,为什么以下替代方案不起作用?当在标准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);
private void searchdocumentsYPEII(SolrDocumentList结果,
SolrIndexSearcher搜索器,字符串q,
UserPermissions up,int ndocs,SolrQueryRequest req,
映射字段,设置alreadyFound)
抛出IOException,ParseException{
字符串qFiltered=q+”和“+”PermissionLevel:“+up.getPermissionLevel();
QueryParser qp=新的QueryParser(qFiltered,new StandardAnalyzer());
Query=qp.parse(qFiltered);
附加(结果,searcher.search)(
查询,空,50)。scoreDocs,
alreadyFound,字段,新HashMap(),0,
searcher.getReader(),true);

}

好消息:您不需要编写任何代码来实现这一点,只需正确配置Solr即可。超级用户将点击标准请求处理程序,而普通用户将点击另一个请求处理程序(也是一个
solr.StandardRequestHandler
),该请求处理程序配置了一个带有要强制执行的筛选器查询的


请参阅

> Pur>看看这个SURR Wiki页面,它说我们应该首先考虑使用,如果它不能满足你的需要,那么写下自己的Reqththand文件

哦。如前所述,这个答案对我有效。请随意评论或抨击

   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);
        }
private void searchdocumentsYPEII(SolrDocumentList结果,
SolrIndexSearcher搜索器,字符串q,
UserPermissions up,int ndocs,SolrQueryRequest req,
映射字段,设置alreadyFound)
抛出IOException,ParseException{
BooleanQuery bq=新的BooleanQuery();
字符串permLvl=“PermissionLevel:+up.getPermissionLevel();
QParser parser=QParser.getParser(permLvl,null,req);
add(parser.getQuery(),occure.MUST);
过滤器过滤器=CachingWrapperFilter(新查询过滤器(bq));
QueryParser qp=新的QueryParser(q,新的StandardAnalyzer());
Q