重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这一篇写一下springboot整合solr,代码已经上传到github,传送门。
成都创新互联公司专业为企业提供未央网站建设、未央做网站、未央网站设计、未央网站制作等企业网站建设、网页设计与制作、未央企业网站模板建站服务,10余年未央做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
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 ListqueryAll() { 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 Listquery(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,传送门。