solr7集群 springboot_springboot整合solr的方法详解

这一篇写一下springboot整合solr,代码已经上传到github,传送门。

1、新建core并配置schema

solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型。

配置完毕后启动solr。

2、相关配置

配置maven

org.springframework.boot

spring-boot-starter-data-solr

配置application.properties相关solr的内容

# solr配置

spring.data.solr.host=http://localhost:8983/solr/book_core

如果想同时使用好几个core,通过HttpSolrClient solrClient = new HttpSolrClient(url);构造出对应core的solrClient进行相关操作。

3、solr增删改查

3.1、新增实体

@SolrDocument(solrCoreName = "book_core")

public class Book {

@Id

@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

SolrClient solrClient;

@Override

public void add(Book book) {

SolrInputDocument document = new SolrInputDocument();

document.setField("id",book.getId());

document.setField("description",book.getDescription());

try {

solrClient.add(document);

solrClient.commit();

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void delete(String query) {

try {

solrClient.deleteByQuery(query);

solrClient.commit();

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public Book update(Book book) {

try {

solrClient.addBean(book);

solrClient.commit();

} catch (IOException e) {

e.printStackTrace();

} catch (SolrServerException e) {

e.printStackTrace();

}

return book;

}

增加删除修改都差不多,增加和修改可以通过add(SolrInputDocument)和addBean,根据主键是否存在来判断是新增还是修改,删除可以通过主键或者条件进行删除。增删改之后一定要记得commit!

主键是在schema中配置的,默认有 id字段做主键,也可以自定义主键,在schema中配置。

通过add方法加了几个demo后,可以在solr管理页面的查询出查看添加的内容

3.3查询

查询则通过SolrQuery入参进行查询

@Override

public List queryAll() {

List bookList = new ArrayList();

SolrQuery solrQuery = new SolrQuery();

solrQuery.setQuery("*:*");

try {

QueryResponse queryResponse = solrClient.query(solrQuery);

if (queryResponse != null){

bookList = queryResponse.getBeans(Book.class);

}

} catch (SolrServerException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return bookList;

同时我写了一个jsp页面来展示查询结果。

到此,增删改查的基本操作都已经实现了,更多高级用法可以参考官方api文档。

4、高亮

一开始在尝试使用高亮时发现无法起作用,排查后发现高亮是在QueryResponse中的另一个结果集的。

QueryResponse.getHighlighting()

取出来的字段值为自定义前缀后缀拼接具体字段值。

@Override

public List query(String query) {

List bookList = new ArrayList();

SolrQuery solrQuery = new SolrQuery();

//设置默认搜索的域

solrQuery.set("df", "description");

solrQuery.setQuery(query);

//高亮显示

solrQuery.setHighlight(true);

//设置高亮显示的域

solrQuery.addHighlightField("description");

//高亮显示前缀

solrQuery.setHighlightSimplePre("");

//后缀

solrQuery.setHighlightSimplePost("");

try {

QueryResponse queryResponse = solrClient.query(solrQuery);

if (queryResponse == null){

return null;

}

SolrDocumentList solrDocumentList = queryResponse.getResults();

if (solrDocumentList.isEmpty()){

return null;

}

//获取高亮

Map>> map = queryResponse.getHighlighting();

for (SolrDocument solrDocument : solrDocumentList){

Book book;

List 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 e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return bookList;

}

页面展示如下:

搜索框分词之后,搜索出来的带有高亮的值。

增删改查最基本的应用就差不多了,更高级的代码请查看官方api文档。上文中所有代码都上传至github,传送门。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值