首页 文章

如何使用solrj将solr搜索响应转换为POJO时添加文档的搜索分数

提问于
浏览
2

我正在使用SolrJ与Solr实例进行交互 . 我只想获得Solr针对特定搜索查询返回的每个文档的搜索分数 . 如果我使用@Field注释在我的POJO中添加一个得分字段,它在检索文档时完全正常 . 当我尝试通过相同的POJO索引某些内容时,Solr会返回一个错误,指出未知字段“得分”,因为我的Solr架构中没有任何名为“score”的字段 . 但是,如果我在我的Solr架构中添加一个名为“score”的字段,它将开始返回分数的默认值而不是搜索分数 . 请建议我如何解决这个问题 . 我不想逐个遍历所有文档并将分数添加到POJO . 我正在执行以下步骤:

public void getSolrResult(String query) {
 SolrQuery query = new SolrQuery();
 query.set("q", query);
 query.set("fl", "*, score");
 QueryResponse queryResponse = solrjClient.query(query);
 solrResult = queryResponse.getBeans(PojoSolr.class);
}
Class PojoSolr {

 //Other fields
 @Field("score")
 private float searchScore;

 public float getSearchScore(){
  return searchScore;
 }
 public void setSearchScore(float score) {
  this.searchScore = score;
 }
}

2 回答

  • 0

    我使用继承解决了类似的问题 .

    只需将得分字段向下移动到子类 . 使用基类进行索引,使用子类进行查询 .

    class PojoSolr {
        //Other fields
    }
    class PojoSolrOutput extends PojoSolr {
        @Field("score")
        private float searchScore;
    }
    

    请注意,反过来也有用例,例如:未存储的字段,因此无法检索,但必须编制索引 . 在这种情况下,包含这些字段的另一个子类 PojoSolrInput 是有意义的 .

    希望这可以帮助 .

  • 0

    我对此主题的30分钟搜索只引导我发布此帖子并且:

    在第二个建议从分数中删除 @Field 注释,但它不起作用 . 在这两个地方都没有提出有效的解决方案 .

    所以我想出了在"raw"结果上循环的解决方案,将它们绑定为 getBeans ,并添加得分:

    SolrDocumentList sdl = response.getResults();
    List<T> documents = new LinkedList<>();
    for (SolrDocument sd : sdl) {
        @SuppressWarnings("unchecked")
        T sb = (T) getClient().getBinder().getBean(<T class>, sd);
        sb.setScore((Float) sd.get("score"));
        documents.add(sb);
    }
    

相关问题