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
凌驾;fl";在自定义SearchComponent中使用SolrParams的Solr中的参数_Solr - Fatal编程技术网

凌驾;fl";在自定义SearchComponent中使用SolrParams的Solr中的参数

凌驾;fl";在自定义SearchComponent中使用SolrParams的Solr中的参数,solr,Solr,我有一个有趣的Solr实现用例,其中Solr模式中有一些字段在执行查询时不应返回。理想的解决方案是更改调用程序,这样它就不会像现在这样查询&fl=score,只请求必要的字段,但这在短期内不会发生,因此在此期间,我们必须从Solr响应中过滤掉一些字段 我们认为对性能影响最小的方法(让我知道是否有更好的方法)是覆盖&fl=参数,以便它列出所有字段,但不包括应该过滤掉的字段。为此,我们在RequestHandler组件列表中添加了一个新的SearchComponent,用于修改&fl参数。我们使用这

我有一个有趣的Solr实现用例,其中Solr模式中有一些字段在执行查询时不应返回。理想的解决方案是更改调用程序,这样它就不会像现在这样查询
&fl=score
,只请求必要的字段,但这在短期内不会发生,因此在此期间,我们必须从Solr响应中过滤掉一些字段

我们认为对性能影响最小的方法(让我知道是否有更好的方法)是覆盖
&fl=
参数,以便它列出所有字段,但不包括应该过滤掉的字段。为此,我们在RequestHandler组件列表中添加了一个新的SearchComponent,用于修改
&fl
参数。我们使用这种方法遇到的问题是,一旦我们从
SolrQueryRequest
获取
SolrParams
,它就不能被修改(我认为这是正确的做法,因为它可能会改变另一个SearchComponent所依赖的东西)。但是我们仍然需要找到一种方法来移除这些额外的字段

这就是我们开始编写的代码:

public void prepare(ResponseBuilder rb) throws IOException {
        SolrQueryRequest req = rb.req;
        SolrParams params = req.getParams();
        String fl = params.get("fl");
        //Remove the "fl" parameter from params and replace it with a new list:
        //Cannot be done"
        ...
遇到了无法添加到
SolrParams
的问题

作为计划B,同一个SearchComponent正在删除
process()
方法中的字段,但这样做速度较慢。代码必须经过生成的SolrDocumentList,对于每个SolrDocument调用
removeFields()
,类似于:(简化代码)

公共作废流程(ResponseBuilder rb)引发IOException{
...
SolrQueryResponse rsp=rb.rsp;
NamedList values=rsp.getValues();
SolrDocumentList文档=(SolrDocumentList)values.get(“响应”);
迭代器docsIterator=sdoclist.Iterator();
while(docsIterator.hasNext()){
SolrDocument sd=sdociator.next();
sd.移除字段(字段);
...
关于如何/如果能够实现这一点,有什么想法吗


感谢您的建议!

使用您自己的SearchHandler,您可以在任何查询参数上指定不变量(无论请求如何,都将始终保持不变),其中有&fl

这是一种类似于:

<requestHandler name="filtered" class="solr.StandardRequestHandler">
    <lst name="invariants">
      <str name="fl">score,id,something_else,etc.</bool>
    </lst>

  </requestHandler>

分数、身份证、其他东西等。
更多文档:

唯一的问题是,目前没有负的fl参数(即返回除我告诉您的字段之外的所有字段)


最后,要指定要在查询时使用的SearchHandler,只需添加&qt=filtered(或您使用的名称)

尝试从
返回字段对象中删除不需要的字段。
例如,类似这样的内容:

@覆盖
公共无效进程(ResponseBuilder rb)引发IOException{
字符串fl=rb.req.getParams().get(CommonParams.fl);
列表字段=Lists.newArrayList(fl.split(“,”);
List newFields=Lists.newArrayList();
用于(字符串字段:字段){
如果(!field.equals(“分数”)){
newFields.add(字段);
}
}
字符串newFl=Joiner.on(“,”).join(newFields);
ReturnFields ReturnFields=新的ReturnFields(newFl,rb.req);
rb.rsp.setReturnFields(返回字段);
}
我在solrconfig.xml的“last components”中设置了自定义
SearchComponent


注:我在使用guava库来创建列表和Joiner。

我认为您应该创建自己的QueryParser,而不是SearchComponent。在那里您可以更改
fl
参数。
<requestHandler name="filtered" class="solr.StandardRequestHandler">
    <lst name="invariants">
      <str name="fl">score,id,something_else,etc.</bool>
    </lst>

  </requestHandler>