springboot整合solr的方法详解

作者:Leon_W 时间:2023-01-20 17:54:37 

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

1、新建core并配置schema

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


<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"/>

配置完毕后启动solr。

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

如果想同时使用好几个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管理页面的查询出查看添加的内容

springboot整合solr的方法详解

3.3查询

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


@Override
 public List<Book> queryAll() {
   List<Book> bookList = new ArrayList<Book>();
   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页面来展示查询结果。

springboot整合solr的方法详解

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

4、高亮

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

QueryResponse.getHighlighting()

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


@Override
 public List<Book> query(String query) {
   List<Book> bookList = new ArrayList<Book>();
   SolrQuery solrQuery = new SolrQuery();
   //设置默认搜索的域
   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 e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }
   return bookList;
 }

页面展示如下:

springboot整合solr的方法详解

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

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

来源:https://www.cnblogs.com/wdfordream/p/11377161.html

标签:springboot,整合,solr
0
投稿

猜你喜欢

  • c#高效比对大量图片的实例代码

    2022-04-27 07:21:18
  • Spring 事务事件监控及实现原理解析

    2023-12-24 04:20:20
  • C#通过反射创建自定义泛型

    2022-12-30 07:12:38
  • Springboot+Mybatis-plus不使用SQL语句进行多表添加操作及问题小结

    2021-09-30 10:31:10
  • java使用jacob实现word转pdf

    2023-05-12 11:45:33
  • Android Compose衰减动画Animatable使用详解

    2022-08-26 23:09:42
  • 用JAVA实现杨辉三角实例

    2023-08-28 16:45:23
  • Android 如何从零开始写一款书籍阅读器的示例

    2022-10-20 17:52:08
  • Android基于opencv实现多通道分离与合并

    2022-05-04 09:49:29
  • C#设计模式之Builder生成器模式解决带老婆配置电脑问题实例

    2021-07-09 03:22:59
  • Java面向对象编程的三大特征

    2023-09-19 06:20:34
  • Java设计模式七大原则之单一职责原则详解

    2022-05-12 20:48:58
  • 分布式调度XXL-Job整合Springboot2.X实战操作过程(推荐)

    2023-11-23 09:43:38
  • Android编程设置屏幕亮度的方法

    2022-07-02 16:40:52
  • Android查看文件夹大小以及删除文件夹的工具类

    2023-06-12 05:51:10
  • Spring框架学习之Cache抽象详解

    2023-07-20 17:37:47
  • MyBatisPlus代码生成器的使用示例

    2022-04-28 07:52:42
  • IntelliJ IDEA 常用设置(配置)吐血整理(首次安装必需)

    2021-06-24 15:23:49
  • C#实现让窗体永远在窗体最前面显示的实例

    2022-09-25 21:40:17
  • java实现小i机器人api接口调用示例

    2023-02-05 00:09:15
  • asp之家 软件编程 m.aspxhome.com