另一个可能令人尴尬的问题。请随时指出任何可能被忽视的明显解决方案 - 我之前搜索过解决方案但一无所获,但有时这是选择错误关键字进行搜索的问题。
情况如下:几个月前为企业系统编写了我自己的 RequestHandler,以便在对 solr 核心进行的所有查询中注入一些必要的安全参数作为额外的过滤器。一切都运行顺利,直到从索引查询产生的文档被收集并返回给用户的部分。
基本上在创建过滤器并执行查询之后,我们得到一组文档 id(和分数),但是我们必须遍历这些 id 以构建结果集,一次一个命中 - 这很好查询标准请求处理程序慢 10 倍,并且随着结果数量的增加,只会变得更糟。更糟糕的是,由于我们的模式在很大程度上依赖于动态字段以获得灵活性,因此(据我所知)没有办法(据我所知)以前检索要检索每个文档的字段列表,除了测试每个文档的所有可能组合。
下面的代码是在生产中运行的代码的简化版本,用于查询 SolrIndexSearcher 并构建响应。
事不宜迟,我的问题是:
- 有什么方法可以一次检索所有结果,而不是按文档构建响应文档?
- 是否有可能获取每个结果的字段列表,而不是测试所有可能的组合?
- 我应该注意此代码中的任何特定 WTF?随意踢我!
//function that queries index and handles results
private void searchCore(SolrIndexSearcher searcher, Query query,
Filter filter, int num, SolrDocumentList results) {
//Executes the query
TopDocs col = searcher.search(query,filter, num);
//results
ScoreDoc[] docs = col.scoreDocs;
//iterate & build documents
for (ScoreDoc hit : docs) {
Document doc = reader.document(hit.doc);
SolrDocument sdoc = new SolrDocument();
for(Object f : doc.getFields()) {
Field fd = ((Field) f);
//strings
if (fd.isStored() && (fd.stringValue() != null))
sdoc.addField(fd.name(), fd.stringValue());
else if(fd.isStored()) {
//Dynamic Longs
if (fd.name().matches(".*_l") ) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
long testLong = a.getLong(0);
sdoc.addField(fd.name(), testLong );
}
//Dynamic Dates
else if(fd.name().matches(".*_dt")) {
ByteBuffer a = ByteBuffer.wrap(fd.getBinaryValue(),
fd.getBinaryOffset(), fd.getBinaryLength());
Date dt = new Date(a.getLong());
sdoc.addField(fd.name(), dt );
}
//...
}
}
results.add(sdoc);
}
}