「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战」
1、前言
在上一篇的分享中([Solr应用总结(二) - 掘金 (juejin.cn)](juejin.cn/post/706459…
2、SpringBoot结合Solr
先在pom文件中引入solr依赖:
<!--solr-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
然后在配置文件中,增加solr服务器的地址:
spring.data.solr.host=http://127.0.0.1:8983/solr/
进行查询:
SolrQuery solrQuery = new SolrQuery();
String searchKeyWords = "测试";
solrQuery.setQuery(String.format("%s:%s", "nickname", searchKeyWords));
//从第几条开始查询
solrQuery.setStart(0);
//设置查询的条数
solrQuery.setRows(10);
QueryResponse response = solrClient.query("test-core", solrQuery);
//查出来的数据转换成JavaBean
List<SolrSearchResult> searchResults = response.getBeans(SolrSearchResult.class);
//注意,这里要在SolrSearchResult类中的字段上加上@Field注解
3、多字段匹配
这里指的是当我们需要根据一个搜索关键词同时去检索多个字段时的情况,比如关键词为“测试”,需要检索文章的标题、标签、作者昵称中匹配的数据。
1、通过配置copyField解决:
<!-- 在solr的字段配置文件manage-schema中增加如下: -->
<field name="search_words" type="string" indexed="true" stored="true" multiValued="true"/>
<!-- multiValued="true" 属性必须添加 -->
<copyField source="title" dest="search_words"/>
<copyField source="tags" dest="search_words"/>
<copyField source="creator_nickname" dest="search_words"/>
配置完成后,重启solr,或者reload对应的core,进行查询即可看到search_words字段中包含了title、tags、creator_nickname这三个字段的所有内容。这样我们将查询条件设置为search_words:xxx即可。
2、代码中解决:
//查询条件中拼接 AND/OR
StringBuilder sb = new StringBuilder();
sb.append(String.format("%s:%s", "title", searchKeyWords));
sb.append(" OR ");
sb.append(String.format("%s:%s", "tags", searchKeyWords));
sb.append(" OR ");
sb.append(String.format("%s:%s", "creator_nickname", searchKeyWords));
solrQuery.setQuery(sb.toString());
PS:最后,我们要特别注意搜索关键词中的空格,在7.0版本之前默认,比如:传入的search_words="我要 唱歌",则默认检索条件为:“我要” OR “唱歌”,在7.0版本之后,写法要更改为:
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("q.op", "and");
solrQuery.add(params);
4、solr查询参数
fq:过滤条件,比如type=article,表示在type=article的数据中检索;
start:查询结果从第几条开始返回,分页使用;
rows:查询的条数,结合start可以实现分页;
fl:置顶返回结果中有哪些字段,例如fl=title,tags,creator_nickname;
df:默认的查询字段;
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊