Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
使用组字段时,spring data solr是否会中断分页?_Spring_Solr_Pagination_Group By_Spring Data Solr - Fatal编程技术网

使用组字段时,spring data solr是否会中断分页?

使用组字段时,spring data solr是否会中断分页?,spring,solr,pagination,group-by,spring-data-solr,Spring,Solr,Pagination,Group By,Spring Data Solr,我目前使用SpringDataSolr库并实现它的存储库接口,我正在尝试向使用solr模板和SimpleQuery的一个自定义查询添加功能。它目前使用的分页似乎工作得很好,但是,我想使用一个组字段,以便兄弟产品在第一次出现时只计算一次。我已经在查询中设置了group字段,它工作得很好,但是,在构建页面属性时,它似乎仍然使用未分组的文档数 有没有已知的解决方法 查询语法为此提供了以下参数,但SpringDataSolr似乎没有利用它&group.ngroups=true应返回结果中的组数,从而给出

我目前使用SpringDataSolr库并实现它的存储库接口,我正在尝试向使用solr模板和SimpleQuery的一个自定义查询添加功能。它目前使用的分页似乎工作得很好,但是,我想使用一个组字段,以便兄弟产品在第一次出现时只计算一次。我已经在查询中设置了group字段,它工作得很好,但是,在构建页面属性时,它似乎仍然使用未分组的文档数

有没有已知的解决方法

查询语法为此提供了以下参数,但SpringDataSolr似乎没有利用它
&group.ngroups=true
应返回结果中的组数,从而给出正确的页码


请提供任何其他信息。

添加此参数实际上有两种方法

使用
QueryParser
s将查询转换为solr格式,因此可以注册一个修改的查询

QueryParser modifiedParser = new DefaultQueryParser() {

    @Override
    protected void appendGroupByFields(SolrQuery solrQuery, List<Field> fields) {

        super.appendGroupByFields(solrQuery, fields);
        solrQuery.set(GroupParams.GROUP_TOTAL_COUNT, true);
    }
};

solrTemplate.registerQueryParser(Query.class, modifiedParser);

请随意查看。

Iv仔细查看,似乎DefaultQueryParser中的以下行是
solrQuery.setParam(GroupParams.GROUP_MAIN,true),它导致组查询的结果被展平并作为响应中的正常结果返回,这很好,只是组计数值作为组的属性返回。因此,在您描述的示例中,它根本不会被返回。我已经修改了SolrTemplate来处理没有“GroupParams.group_MAIN”的组查询,但我不确定它是正确的解决方案。它不会破坏任何库测试或我自己的测试。
final Query query = //...whatever query you have.

List<DomainType> result = solrTemplate.execute(new SolrCallback<List<DomainType>>() {

    @Override
    public List<DomainType> doInSolr(SolrServer solrServer) throws SolrServerException, IOException {

        SolrQuery solrQuery = new QueryParsers().getForClass(query.getClass()).constructSolrQuery(query);

        //add missing params
        solrQuery.set(GroupParams.GROUP_TOTAL_COUNT, true);

        return solrTemplate.convertQueryResponseToBeans(solrServer.query(solrQuery), DomainType.class);
    }
});