另一个可能令人尴尬的问题。请随意指出任何可能被忽略的明显解决方案 - 我之前搜索过的解决方案一无所获,但有时候选择错误的关键字来搜索。 下面是这样的情况:几个月前为一个企业-Y系统编写了我自己的RequestHandler,以便在对solr核心进行的所有查询中注入一些必要的安全参数作为额外的过滤器。一切都顺利进行,直到收集到对索引的查询产生的文档的部分,然后返回给用户。
基本上在创建过滤器并执行查询后,我们得到一组文档ID(和分数),但是我们必须遍历id以构建结果集,一次点击一次 - 查询标准请求处理程序的速度要慢10倍,并且随着结果数量的增加,只会变得更糟。更糟糕的是,由于我们的模式在很大程度上依赖于动态字段的灵活性,因此除了测试每个文档的所有可能组合之外,没有办法(我知道)以前检索每个文档检索的字段列表。
以下代码是生产中运行的简化版本,用于查询SolrIndexSearcher并构建响应。
不用多说,我的问题是:
//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);
}
}
答案 0 :(得分:0)
每个OP请求:
虽然这不能回答您的具体问题,但我建议您另外选择解决问题。
要向所有查询添加过滤器,可以在SolrConfig.xml文件中向StandardRequestHandler添加“附加”部分。添加“fl”(代表过滤器)部分并添加过滤器。通过StandardRequestHandler传输的每个请求都会自动附加过滤器。
此过滤器与其他过滤器一样,因此它将缓存在FilterCache中。结果是在查询时相当快速地过滤(通过docIds)。这可以让您避免必须在解决方案中提取单个文档以应用过滤条件。