首页 > 编程 > Java > 正文

springboot整合solr的方法详解

2019-11-26 08:42:31
字体:
来源:转载
供稿:网友

这一篇写一下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管理页面的查询出查看添加的内容

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页面来展示查询结果。

到此,增删改查的基本操作都已经实现了,更多高级用法可以参考官方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;  }

页面展示如下:

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表