ApacheSolr扩展Demax参数的Spring数据
我试图在SpringDataSolr生成的Solr查询中添加下面的参数(qf,bq) Solr参数为:ApacheSolr扩展Demax参数的Spring数据,solr,spring-data,spring-data-solr,Solr,Spring Data,Spring Data Solr,我试图在SpringDataSolr生成的Solr查询中添加下面的参数(qf,bq) Solr参数为: qf => Spring Data Solr Method? bq => Spring Data Solr Method? 我能够找到下面的方法 fq => addFilterQuery fl => addProjectionOnField defType => setDefType qt => setRequestHandler 我看到一个公开发行的q
qf => Spring Data Solr Method?
bq => Spring Data Solr Method?
我能够找到下面的方法
fq => addFilterQuery
fl => addProjectionOnField
defType => setDefType
qt => setRequestHandler
我看到一个公开发行的qf
如何将qf和bq参数添加到使用Spring数据Solr构建的Solr查询中
谢谢您可以在模板级别使用
SolrCallback
访问SolrClient
并从那里执行查询,或者注册您自己的QueryParser
以获得自定义查询类型
可能是这样的:
@Bean
公共SolrTemplate SolrTemplate(SolrClient客户端){
SolrTemplate=新的SolrTemplate(客户端);
registerQueryParser(EdismaxQuery.class,新的EdisMaxQueryParser());
返回模板;
}
类eDiscovery扩展了SimpleQuery{
//…添加你需要的东西,也许是“自动释放”`
}
类EdisMaxQueryParser扩展了QueryParserBase{
DefaultQueryParser DefaultQueryParser=新的DefaultQueryParser();
@凌驾
公共SolrQuery文档构造SolrQuery(eDiscovery源){
//首先,只需使用默认解析器来构造查询字符串。
SolrQuery目标=defaultQueryParser.ConstructionSolrQuery(源);
//添加缺少的参数
添加(“defType”、“edismax”);
目标。添加(“qf”,来源……);
回报目标;
}
}
为了避免:
org.springframework.data.solr.core.QueryParserBase$NamedObjectsQuery
无法强制转换为eDiscovery
eDiscoveryParser应如下所示:
class EdisMaxQueryParser extends QueryParserBase {
@Override
public SolrQuery doConstructSolrQuery(SolrDataQuery source) {
// your stuff
}
}
如果要向每个select查询添加静态qf表达式,可以在solrconfig.xml中完成:
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
...
</lst>
<lst name="appends">
<str name="defType">edismax</str>
<str name="qf">offerId^100 vendorCode^100</str>
</lst>
...
</requestHandler>
...
埃迪斯马克斯
提供^100卖方代码^100
...
Spring Data Solr API 4.0中有一些更改,因此您可能需要稍微更改一下注册自己的QueryParser
的方式
@Bean
公共SolrTemplate SolrTemplate(SolrClient客户端){
SolrTemplate=新的SolrTemplate(客户端);
registerQueryParser(EdismaxQuery.class,新的EdisMaxQueryParser(新的SimpleSolrMappingContext());
返回模板;
}
公共静态类eDiscovery扩展了SimpleQuery{
私有字符串字段;
私有字符串最小值应匹配;
私有字符串boostQuery;
私有字符串查询字段;
公共eDiscovery(字符串查询字符串){
超级(查询字符串);
}
//…典型的getter/setter
}
公共静态类EdisMaxQueryParser扩展了QueryParserBase{
私有最终DefaultQueryParser DefaultQueryParser;
公共eDiscoveryParser(MappingContext,SolrPersistentProperty>MappingContext){
super(mappingContext);
defaultQueryParser=新的defaultQueryParser(映射上下文);
}
@凌驾
公共SolrQuery文档构造SolrQuery(AbstractQueryCorator QueryCorator,类domainType){
//由于某种原因,API用NamedObjectsQuery包装了我们的查询对象,因此我们需要首先打开/获取实际的查询对象
EdismaxQuery=(EdismaxQuery)querycorator.getDecoratedQuery();
//使用defaultQueryParser填充基本查询参数
SolrQuery SolrQuery=defaultQueryParser.doConstructSolrQuery(查询,域类型);
//设置我们自己的“额外”参数
如果(query.getDefaultField()!=null){
add(“df”,query.getDefaultField());
}
if(query.getMinimumShouldMatch()!=null){
add(“mm”,query.getMinimumShouldMatch());
}
if(query.getQueryField()!=null){
add(“qf”,query.getQueryField());
}
if(query.getBoostQuery()!=null){
add(“bq”,query.getBoostQuery());
}
//...
回报目标;
}
}
以下是如何使用新的eDiscovery对象进行查询
EdismaxQuery query=newedismaxquery(“你好世界”);
query.setDefType(“edismax”);
query.setRows(3);
query.setQueryField(“文本^2”);
query.setMinimumShouldMatch(“30%”);
query.setBoostQuery(“日期:[现在/天-1年到现在/天]”;
页面结果=solrTemplate.query(“collection”,query,ResultBean.class);
您可以将eDiscoveryMax库用于spring solr
但是为了克服覆盖AfterPropertieSet()上注册的查询解析器的问题,您需要在config类中添加以下bean
@Bean
public SolrTemplate solrTemplate(SolrClient client) {
SolrTemplate template = new SolrTemplate(client) {
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
registerQueryParser(SimpleEdismaxQuery.class, new EdisMaxQueryParser(new SimpleSolrMappingContext()));
}
};
template.afterPropertiesSet();
return template;
}
另外,示例代码位于
我遇到了这个错误:org.springframework.data.solr.core.QueryParserBase$NamedObjectsQuery无法转换为eDiscovery