• springboot整合solr


    上一篇博客中简要写了solr在windows的安装与配置,这一篇接上文写一下springboot整合solr,代码已经上传到github,传送门

    1、新建core并配置schema

    上篇博客中已经有了相关内容,就不在展开叙述了,具体仿照3.2和3.3的配置schema,原文地址https://www.cnblogs.com/wdfordream/p/11352053.html

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

    本人只是个小白,以上只是个人拙见,如果有问题还请大家指出,有更好的想法欢迎大家留言,一起进步,谢谢!

  • 相关阅读:
    Redis 思维导图 (解析版)
    一张图片了解redis
    Redis 思维导图
    计算机网络协议
    IT笔面试题
    Hadoop集群搭建
    天涯论坛只看楼主
    齐秦&r大约在冬季现场版
    郁可唯茶汤现场版
    MTK平台电路设计01
  • 原文地址:https://www.cnblogs.com/wdfordream/p/11377161.html
Copyright © 2020-2023  润新知