栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot整合solr的方法详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,传送门。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/137303.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号