Solr Custom RequestHandler-优化结果
还有一个可能令人尴尬的问题。请随意指出可能被忽略的任何明显的解决方案-我以前搜索过解决方案,但没有找到任何结果,但有时这是选择错误的关键字来搜索的问题。Solr Custom RequestHandler-优化结果,solr,full-text-search,requesthandler,Solr,Full Text Search,Requesthandler,还有一个可能令人尴尬的问题。请随意指出可能被忽略的任何明显的解决方案-我以前搜索过解决方案,但没有找到任何结果,但有时这是选择错误的关键字来搜索的问题。 情况是这样的:几个月前,我为enterprise-y系统编写了自己的RequestHandler,以便在对solr核心的所有查询中注入一些必要的安全参数作为额外的过滤器。在索引查询产生的文档被收集并返回给用户之前,一切都会顺利运行 基本上,在创建过滤器并执行查询之后,我们会得到一组文档ID(和分数),但随后我们必须迭代ID以构建结果集,一次点击
情况是这样的:几个月前,我为enterprise-y系统编写了自己的RequestHandler,以便在对solr核心的所有查询中注入一些必要的安全参数作为额外的过滤器。在索引查询产生的文档被收集并返回给用户之前,一切都会顺利运行 基本上,在创建过滤器并执行查询之后,我们会得到一组文档ID(和分数),但随后我们必须迭代ID以构建结果集,一次点击一次-这比查询标准requesthandler慢10倍,并且只会随着结果数目的增加而变得更糟。更糟糕的是,由于我们的模式在很大程度上依赖于动态字段以获得灵活性,因此(据我所知)除了测试每个文档的所有可能组合之外,以前无法检索每个文档要检索的字段列表 下面的代码是在生产环境中运行的代码的简化版本,用于查询SolrIndexSearcher和构建响应 恕我直言,我的问题是:
- 有没有办法一次检索所有结果,而不是逐个文档构建响应文档
- 是否有可能获得每个结果的字段列表,而不是测试所有可能的组合
- 这段代码中有没有我应该知道的特定WTF?随便踢我李>
此筛选器与其他筛选器一样,因此它被缓存在FilterCache中。结果是在查询时相当快地过滤(通过docid)。这可能使您无需提取解决方案中的单个文档来应用筛选条件。为了澄清,您创建此自定义RequestHandler的唯一目的是为每个请求添加额外的筛选器。是吗?@rfeak-简短的回答,是的。相关吗?你有什么不同的建议吗?有。如果我没记错的话(已经两年了),有一些方法可以在添加到每个查询的XML文件中添加默认过滤器。然后,默认过滤器会像其他过滤器一样缓存在FilterCache中。它们与其他过滤器的聚合应该非常快,您不必获取文档来应用过滤器。不确定您是否考虑过这种方法。若要开始查找,请查看在SolrConfigXML中的StandardRequestHandler中添加了一个“appends”部分,该部分在过滤器中添加了一个“fl”部分。@rfeak我认为这可能非常棒。=)我会尝试一下,然后告诉你结果。
//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);
}
}