从 solrj 迁移到 spring-data-solr
Migration from solrj to spring-data-solr
找不到 spring-data-solr 的完整教程。
对迁移到 spring-data-solr
有疑问。
例如,我在 solarj 上有以下查询:
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-data-solr Query
class?甚至 SolrRepository
如果可能的话?您可能想问我到目前为止我尝试了什么:现在我尝试将太阳能查询创建为:
Query query = new SimpleQuery("*:*");
query.setRows(10000);
query.addSort(new Sort(Direction.ASC, SCHOOL_REGION));
但是如何设置 "df"、"fl" 等参数以及所有组参数?我没有看到它的二传手。
第二个问题是我可以使用 SolrCrudRepository
进行这样的复杂查询吗?
这个答案可能对某些人有帮助,所以:
spring-data-solr (v4.0.10.RELEASE) 不支持DisMax Parameters,所以你不能默认使用这些参数,解决方案是创建自定义 SolrQuery:
@Data
@EqualsAndHashCode(callSuper = true)
public class ExtendedQuery extends SimpleQuery {
private List<String> queryFields;
private String defaultField;
}
然后我们可以像这样设置这些参数:
query.setDefaultField(SCHOOL_CITY);
query.setQueryFields(Arrays.asList("school_name^150.0", "school_city^30.0"));
您还需要做的一件事是创建自定义 QueryParser:
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;
}
}
最后一步是注册此解析器:
@Bean
public ExtendedQueryParser extendedQueryParser(SolrTemplate solrTemplate) {
ExtendedQueryParser extendedQueryParser = new ExtendedQueryParser(null);
solrTemplate.registerQueryParser(ExtendedQuery.class, extendedQueryParser);
return extendedQueryParser;
}
找不到 spring-data-solr 的完整教程。
对迁移到 spring-data-solr
有疑问。
例如,我在 solarj 上有以下查询:
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-data-solr Query
class?甚至 SolrRepository
如果可能的话?您可能想问我到目前为止我尝试了什么:现在我尝试将太阳能查询创建为:
Query query = new SimpleQuery("*:*");
query.setRows(10000);
query.addSort(new Sort(Direction.ASC, SCHOOL_REGION));
但是如何设置 "df"、"fl" 等参数以及所有组参数?我没有看到它的二传手。
第二个问题是我可以使用 SolrCrudRepository
进行这样的复杂查询吗?
这个答案可能对某些人有帮助,所以:
spring-data-solr (v4.0.10.RELEASE) 不支持DisMax Parameters,所以你不能默认使用这些参数,解决方案是创建自定义 SolrQuery:
@Data
@EqualsAndHashCode(callSuper = true)
public class ExtendedQuery extends SimpleQuery {
private List<String> queryFields;
private String defaultField;
}
然后我们可以像这样设置这些参数:
query.setDefaultField(SCHOOL_CITY);
query.setQueryFields(Arrays.asList("school_name^150.0", "school_city^30.0"));
您还需要做的一件事是创建自定义 QueryParser:
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;
}
}
最后一步是注册此解析器:
@Bean
public ExtendedQueryParser extendedQueryParser(SolrTemplate solrTemplate) {
ExtendedQueryParser extendedQueryParser = new ExtendedQueryParser(null);
solrTemplate.registerQueryParser(ExtendedQuery.class, extendedQueryParser);
return extendedQueryParser;
}