ApacheSolr扩展Demax参数的Spring数据

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

我试图在SpringDataSolr生成的Solr查询中添加下面的参数(qf,bq)

Solr参数为:

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