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
Solr Custom RequestHandler-优化结果_Solr_Full Text Search_Requesthandler - Fatal编程技术网

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?随便踢我
根据OPs请求:

虽然这并不能回答您的具体问题,但我建议您另一种解决问题的方法

要向所有查询添加筛选器,可以在SolrConfig.xml文件中的StandardRequestHandler中添加“appends”部分。添加“fl”(代表过滤器)部分并添加过滤器。通过StandardRequestHandler传输的每个请求都会自动附加过滤器


此筛选器与其他筛选器一样,因此它被缓存在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);
    }
}