springboot整合solr

springboot整合solr

1、新建core并配置schema

solr安装和配置已经有了相关内容,具体仿照3.2和3.3的配置schema,链接:https://www.cnblogs.com/yu-si/articles/15066621.html

solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型,修改managed-schema文件,路径:solr-7.7.3\server\solr\book_core\conf。

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

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

或yml文件

  data:
    solr:
      host: http://localhost:8983/solr/book_core

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

3、solr增删改查

3.1、新增实体

public class Book {

    @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//或@Resource
    SolrClient solrClient;

    /**
     * SolrAddTest和SolrUpdateTest两个方法是一致的,Solr的core有id为修改,没有id为添加 只是使用方法不同
     */
    @ResponseBody
    @RequestMapping("/SolrAddTest")
    public String add(Book book) {
        DocumentObjectBinder binder = new DocumentObjectBinder();
        SolrInputDocument document = binder.toSolrInputDocument(book);
//        SolrInputDocument document = new SolrInputDocument();
        document.setField("id",book.getId());
        document.setField("description",book.getDescription());
        try {
            solrClient.add(document);
            solrClient.commit();
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
            return "Exception";
        }
        return "ok";
    }


    @ResponseBody
    @RequestMapping("/SolrUpdateTest")
    public Book update(Book book) {
        try {
            solrClient.addBean(book);
            solrClient.commit();
        } catch (IOException | SolrServerException e) {
            e.printStackTrace();
        }
        return book;
    }

    /**
     * 删除
     */
    @ResponseBody
    @RequestMapping("/SolrDeleteTest")
    public String delete(String query) {
        try {
//            solrClient.deleteById(query);//根据id删除
            solrClient.deleteByQuery(query);//根据索引查询删除  *:*   description:你在什么地方
            solrClient.commit();
        } catch (SolrServerException | IOException e) {
            e.printStackTrace();
            return "Exception";
        }
        return "ok";
    }

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

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

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

img

3.3查询

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

@ResponseBody
@RequestMapping("/SolrQueryAllTest")
public List<Book> queryAll() {
    List<Book> bookList = null;
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery("*:*");
    try {
        QueryResponse queryResponse = solrClient.query(solrQuery);
        if (queryResponse != null) {
            bookList = queryResponse.getBeans(Book.class);
        }
    } catch (SolrServerException | IOException e) {
        e.printStackTrace();
    }
    return bookList;
}

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

img

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

4、高亮

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

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

/**
* 返回搜索指定内容加高亮
*/
@RequestMapping("/SolrQuery")
public List<Book> query(String query) {
    List<Book> bookList = new ArrayList<Book>();
    SolrQuery solrQuery = new SolrQuery();
    //设置默认搜索的域(字段,只能set一个,solrQuery.set("df", "xxx");)
    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 | IOException e) {
        e.printStackTrace();
    }
    return bookList;
}

页面展示如下:

img

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

增删改查最基本的应用就差不多了,更高级的代码请查看官方api文档,上文中所有代码都上传至github,GIt链接:https://github.com/DreamsChaser/solr-demo

原文链接:https://www.cnblogs.com/wdfordream/p/11377161.html

posted @ 2021-07-27 17:10  渝思  阅读(291)  评论(0编辑  收藏  举报