springboot整合solr
springboot整合solr
1、新建core并配置schema
solr安装和配置已经有了相关内容,具体仿照3.2和3.3的配置schema,链接:https://www.cnblogs.com/yu-si/articles/15066621.html
solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型,修改managed-schema文件,路径:solr-7.7.3\server\solr\book_core\conf。
<fieldType name="ik_word" class="solr.TextField">
<analyzer type="index">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<!-- 自定义添加filed -->
<field name="description" type="ik_word" indexed="true" stored="true"/>
2、相关配置
配置maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
配置application.properties相关solr的内容
# solr配置
spring.data.solr.host=http://localhost:8983/solr/book_core
或yml文件
data:
solr:
host: http://localhost:8983/solr/book_core
如果想同时使用好几个core,通过HttpSolrClient solrClient = new HttpSolrClient(url);构造出对应core的solrClient进行相关操作。
3、solr增删改查
3.1、新增实体
public class Book {
@Field
private String id;
@Field
private String description;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
在这里说明一下 实体类上的注解@field和@SolrDocument 是为了QueryResponse.getBeans()能转化成相关实体类,不然无法识别。
3.2增删改
@Autowired//或@Resource
SolrClient solrClient;
/**
* SolrAddTest和SolrUpdateTest两个方法是一致的,Solr的core有id为修改,没有id为添加 只是使用方法不同
*/
@ResponseBody
@RequestMapping("/SolrAddTest")
public String add(Book book) {
DocumentObjectBinder binder = new DocumentObjectBinder();
SolrInputDocument document = binder.toSolrInputDocument(book);
// SolrInputDocument document = new SolrInputDocument();
document.setField("id",book.getId());
document.setField("description",book.getDescription());
try {
solrClient.add(document);
solrClient.commit();
} catch (SolrServerException | IOException e) {
e.printStackTrace();
return "Exception";
}
return "ok";
}
@ResponseBody
@RequestMapping("/SolrUpdateTest")
public Book update(Book book) {
try {
solrClient.addBean(book);
solrClient.commit();
} catch (IOException | SolrServerException e) {
e.printStackTrace();
}
return book;
}
/**
* 删除
*/
@ResponseBody
@RequestMapping("/SolrDeleteTest")
public String delete(String query) {
try {
// solrClient.deleteById(query);//根据id删除
solrClient.deleteByQuery(query);//根据索引查询删除 *:* description:你在什么地方
solrClient.commit();
} catch (SolrServerException | IOException e) {
e.printStackTrace();
return "Exception";
}
return "ok";
}
增加删除修改都差不多,增加和修改可以通过add(SolrInputDocument)和addBean,根据主键是否存在来判断是新增还是修改,删除可以通过主键或者条件进行删除。增删改之后一定要记得commit!
主键是在schema中配置的,默认有 id字段做主键,也可以自定义主键,在schema中配置。
通过add方法加了几个demo后,可以在solr管理页面的查询出查看添加的内容
3.3查询
查询则通过SolrQuery入参进行查询
@ResponseBody
@RequestMapping("/SolrQueryAllTest")
public List<Book> queryAll() {
List<Book> bookList = null;
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("*:*");
try {
QueryResponse queryResponse = solrClient.query(solrQuery);
if (queryResponse != null) {
bookList = queryResponse.getBeans(Book.class);
}
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
return bookList;
}
同时我写了一个jsp页面来展示查询结果。
到此,增删改查的基本操作都已经实现了,更多高级用法可以参考官方api文档。
4、高亮
一开始在尝试使用高亮时发现无法起作用,排查后发现高亮是在QueryResponse中的另一个结果集的。QueryResponse.getHighlighting()
取出来的字段值为自定义前缀后缀拼接具体字段值。
/**
* 返回搜索指定内容加高亮
*/
@RequestMapping("/SolrQuery")
public List<Book> query(String query) {
List<Book> bookList = new ArrayList<Book>();
SolrQuery solrQuery = new SolrQuery();
//设置默认搜索的域(字段,只能set一个,solrQuery.set("df", "xxx");)
solrQuery.set("df", "description");
solrQuery.setQuery(query);
//高亮显示
solrQuery.setHighlight(true);
//设置高亮显示的域
solrQuery.addHighlightField("description");
//高亮显示前缀
solrQuery.setHighlightSimplePre("<font color='red'>");
//后缀
solrQuery.setHighlightSimplePost("</font>");
try {
QueryResponse queryResponse = solrClient.query(solrQuery);
if (queryResponse == null){
return null;
}
SolrDocumentList solrDocumentList = queryResponse.getResults();
if (solrDocumentList.isEmpty()){
return null;
}
//获取高亮
Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting();
for (SolrDocument solrDocument : solrDocumentList){
Book book;
List<String> list = map.get(solrDocument.get("id")).get("description");
if (!CollectionUtils.isEmpty(list)){
solrDocument.setField("description",list.get(0));
}
String bookStr = JSONUtil.toJSON(solrDocument);
book = JSON.parseObject(bookStr,Book.class);
bookList.add(book);
}
} catch (SolrServerException | IOException e) {
e.printStackTrace();
}
return bookList;
}
页面展示如下:
搜索框分词之后,搜索出来的带有高亮的值。
增删改查最基本的应用就差不多了,更高级的代码请查看官方api文档,上文中所有代码都上传至github,GIt链接:https://github.com/DreamsChaser/solr-demo