12N*_*12N 5 java solr requesthandler
简短的问题:我正在寻找一种方法 (java) 来拦截对 Solr 的查询并注入一些由我的业务逻辑提供的额外过滤参数。我应该使用什么结构?
背景:首先,承认一点:我是 Solr 的菜鸟。对我来说,设置一个服务器,定义一个模式,编写一个功能索引管理器,然后实际看到服务器返回正确的结果 - 完全符合预期!- 对自己来说已经是很大的成就了。耶我!
但是,我目前正在从事一个需要多一点的企业项目。粗略地说,solr 实例是通过同一个 requestHandler 被数千个用户查询的,即根据用户的权限级别自动过滤返回的文档。例如,如果用户 A 和超级用户 B 尝试了完全相同的搜索参数(即使是完全相同的 url),则用户 B 将获取用户 A 的所有文件,然后再获取更多。为了实现这一点,文档已经用必要的权限级别信息编入索引。
好吧,考虑到这一点并利用 Solr 为新手开发人员提供的大量文档,我尝试提出一个简单的自定义 requestHandler 来覆盖 handleRequest 函数,以便在 SolrQueryRequest 中注入必要的额外参数。一切都很好——除了我在 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);
Run Code Online (Sandbox Code Playgroud)
}
基本上,不会以任何方式修改搜索查询,而是应用包含用户 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);
Run Code Online (Sandbox Code Playgroud)
}
那好吧。如前所述,答案对我有用。随意评论或抨击!
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6895 次 |
| 最近记录: |