zoukankan      html  css  js  c++  java
  • springboot ElasticSearch 简单的全文检索高亮

    原文:https://segmentfault.com/a/1190000017324038?utm_source=tag-newest

    首先引入依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

    配置文件

    spring.data.elasticsearch.local=true
    spring.data.elasticsearch.repositories.enabled=true
    spring.data.elasticsearch.cluster-name=yourname
    spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300

    然后 创建接口并继承ElasticsearchRepository

    idea 类继承 ElasticsearchRepository

    package com.school.service;
    
    import com.school.model.Idea;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    import org.springframework.stereotype.Component;
    
    @Component
    public interface IdeaRepository extends ElasticsearchRepository<Idea, Long> {
    }
    

    下一步在需要使用的service 或 Controller中 引用

        @Autowired
        private IdeaRepository ideaRepository;      //esjap类
    
        @Autowired
        private ElasticsearchTemplate elasticsearchTemplate;    //es工具

    使用save方法把数据保存到es中
    业务代码忽略... 保存就完事了

    public void save(Long ideaId) {
            // 插入数据到es中
            Idea idea = this.selectById(ideaId);
            idea.setId(ideaId);
            ideaRepository.save(idea);
        }

    全文检索并高亮数据

    这里注意分页的页数是从0开始... 搞得我以为没查到数据debug了很久

    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Pageable;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.data.elasticsearch.core.SearchResultMapper;
    import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
    import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
    import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
    import org.springframework.data.elasticsearch.core.query.SearchQuery;
    
    
        @Autowired
        private IdeaRepository ideaRepository;      //esjap类
    
        @Autowired
        private ElasticsearchTemplate elasticsearchTemplate;    //es工具
    
    
    /**
         * 从es检索数据
         *
         * @param content  搜索关键字
         * @param pageNum  页
         * @param pageSzie 条
         * @return
         */
    public AggregatedPage<Idea> getIdeaListBySrt(String content, Integer pageNum, Integer pageSzie) {
            Pageable pageable = PageRequest.of(pageNum, pageSzie);
    
            String preTag = "<font color='#dd4b39'>";//google的色值
            String postTag = "</font>";
    
            SearchQuery searchQuery = new NativeSearchQueryBuilder().
                    withQuery(matchQuery("ideaTitle", content)).
                    withQuery(matchQuery("ideaContent", content)).
                    withHighlightFields(new HighlightBuilder.Field("ideaTitle").preTags(preTag).postTags(postTag),
                            new HighlightBuilder.Field("ideaContent").preTags(preTag).postTags(postTag)).build();
            searchQuery.setPageable(pageable);
            
            // 不需要高亮直接return ideas 
            // AggregatedPage<Idea> ideas = elasticsearchTemplate.queryForPage(searchQuery, Idea.class);
            
            // 高亮字段
            AggregatedPage<Idea> ideas = elasticsearchTemplate.queryForPage(searchQuery, Idea.class, new SearchResultMapper() {
    
                @Override
                public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
                    List<Idea> chunk = new ArrayList<>();
                    for (SearchHit searchHit : response.getHits()) {
                        if (response.getHits().getHits().length <= 0) {
                            return null;
                        }
                        Idea idea = new Idea();
                        //name or memoe
                        HighlightField ideaTitle = searchHit.getHighlightFields().get("ideaTitle");
                        if (ideaTitle != null) {
                            idea.setIdeaTitle(ideaTitle.fragments()[0].toString());
                        }
                        HighlightField ideaContent = searchHit.getHighlightFields().get("ideaContent");
                        if (ideaContent != null) {
                            idea.setIdeaContent(ideaContent.fragments()[0].toString());
                        }
    
                        chunk.add(idea);
                    }
                    if (chunk.size() > 0) {
                        return new AggregatedPageImpl<>((List<T>) chunk);
                    }
                    return null;
                }
            });
            return ideas;
        }

    其他基础接口直接使用 ideaRepository.

    高亮写法借鉴代码地址点我
    其他方式查询写法地址点我

  • 相关阅读:
    Python爬虫基础之BeautifulSoup
    Python爬虫基础之requests
    Python爬虫基础之UrlError
    Python爬虫基础之Cookie
    module 'socket' has no attribute的解决方案
    ECS——CentOS7下使用yum安装MariaDB
    用 Python 定位特定类型文件
    django——文本编辑器
    解决文件路径的问题的总结
    Django——发送邮件
  • 原文地址:https://www.cnblogs.com/shihaiming/p/11062809.html
Copyright © 2011-2022 走看看