首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从solrj迁移到spring-data-solr

从solrj迁移到spring-data-solr
EN

Stack Overflow用户
提问于 2019-08-16 13:31:13
回答 1查看 572关注 0票数 3

找不到完整的春季数据-solr教程。

有一个关于迁移到spring-data-solr的问题。

例如,我对solarj有以下查询:

代码语言:javascript
复制
SolrQuery query = new SolrQuery();
query.setQuery("*:*");
query.setParam("df", region);
query.setParam("fq", addType(param));
query.setParam("fl", region);
query.setRows(10000);
query.addSort(region, SolrQuery.ORDER.asc);

query.set(GroupParams.GROUP, true);
query.set(GroupParams.GROUP_FIELD, groupField);
query.set(GroupParams.GROUP_MAIN, true);
query.set(GroupParams.GROUP_FORMAT, "simple");
SolrTemplate server = /*initialization*/
server.execute(client -> client.query(SOLR_COLLECTION_NAME, query));

那么,如何将此代码迁移到spring Query类呢?如果可能的话,甚至去SolrRepository?您可能想问我,到目前为止,我尝试了什么:现在,我尝试创建太阳能查询:

代码语言:javascript
复制
Query query = new SimpleQuery("*:*");
query.setRows(10000);
query.addSort(new Sort(Direction.ASC, SCHOOL_REGION));

但是,我如何设置像"df“、"fl”等的对角,以及所有的群对角呢?我不认为这是策划人。

第二个问题是,我可以使用SolrCrudRepository进行这样复杂的查询吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-13 11:16:50

这个答案可能对某人有帮助,所以:

spring (v4.0.10.RELEASE)不支持DisMax参数,因此默认情况下无法使用这些参数,解决方案是创建自定义SolrQuery:

代码语言:javascript
复制
@Data
@EqualsAndHashCode(callSuper = true)
public class ExtendedQuery extends SimpleQuery {
    private List<String> queryFields;
    private String defaultField;
}

然后我们可以设置如下这些参数:

代码语言:javascript
复制
query.setDefaultField(SCHOOL_CITY);
query.setQueryFields(Arrays.asList("school_name^150.0", "school_city^30.0"));

您还需要创建自定义QueryParser

代码语言:javascript
复制
public class ExtendedQueryParser extends QueryParserBase<AbstractQueryDecorator> {

    private final DefaultQueryParser defaultQueryParser;

    public ExtendedQueryParser(MappingContext mappingContext) {
        super(mappingContext);
        defaultQueryParser = new DefaultQueryParser(mappingContext);
    }

    @Override
    public final SolrQuery doConstructSolrQuery(
            AbstractQueryDecorator query, Class<?> domainType) {
        ExtendedQuery decoratedQuery = (ExtendedQuery) query.getDecoratedQuery();

        SolrQuery solrQuery = 
            defaultQueryParser.constructSolrQuery(decoratedQuery, domainType);

        Optional.ofNullable(decoratedQuery.getDefaultField())
            .ifPresent(defaultField -> 
                solrQuery.setParam(CommonParams.DF, defaultField));
        if (!CollectionUtils.isEmpty(decoratedQuery.getQueryFields())) {
            solrQuery.setParam(DisMaxParams.QF, 
                String.join(SPACE, decoratedQuery.getQueryFields()));
        }

        return solrQuery;
    }
}

最后一步是注册这个解析器:

代码语言:javascript
复制
@Bean
public ExtendedQueryParser extendedQueryParser(SolrTemplate solrTemplate) {
    ExtendedQueryParser extendedQueryParser = new ExtendedQueryParser(null);
    solrTemplate.registerQueryParser(ExtendedQuery.class, extendedQueryParser);
    return extendedQueryParser;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57525564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档