springboot ElasticSearch 简单的全文检索高亮

摘要:
原文:https://segmentfault.com/a/1190000017324038?utm_source=tag-newest首先引入依赖org.springframework.bootspring-boot-starter-data-elasticsearch˂/depend

原文: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.

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

免责声明:文章转载自《springboot ElasticSearch 简单的全文检索高亮》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jSignature手写签名Ubuntu 16.04 安装摄像头驱动usb_cam下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

idea成功部署项目到tomcat后却无法访问

问题描述: 同一个项目,通过exlipse部署到tomcat后可以正常访问,但是通过idea部署后却无法访问? 无法正常访问项目的原因很多,这里只介绍一下我前段时间遇到问题的原因。原因: 当项目成功部署后,tomcat下的webapps可以正常访问的目录结构为 而我自己使用idea部署到tomcat的项目,访问时却无法找到,此时的目录结构为 通过上述两个目...

借助强大的IDEA开发ide高效实现equals,hashcode以及toString方法

 IDEA工具提供多种生成hashCode与equals的代码方案,注意:尽量不要使用第一个方案,第一个方案对于null不做判空处理,容易NNP问题。 对于生成toString方法方案,默认使用的是+拼接的方式,这种效率低,可以选择StringBuilder或者StringBuffer方案。...

1012.idea关联数据库

(需要idea ulitmate版本) 在代码编辑窗口右侧有 database工具  图标 1: 同步当前的数据库连接。 这个是最重要的操作。配置好连接以后或通过其他工具 操作数据库以后,需要及时同步。  图标 2: 配置当前的连接。  图标 3: 断开当前的连接。  图标 4:显示相应数据库对象的数据  图标 5:编辑修改当前数据库对象 1....

十六、源码部署EFK之快乐没有了

一、事情起因 我看的老男孩76期ELK课程的day106缺了第12集,这一集讲的是安装Filebeat呈现Nginx日志的过程,于是快乐没有了。 因为课程缺失,我看了很多关于Filebeat的博文,但由于版本差异,配置文件也有些许差异;同时还有架构上的不同,导致各式各样的安装方式;为了少走弯路同时更加深入的了解ELK的部署以及运行,我花了两天时间看完了千锋...

Elasticsearch logstsh测试数据新增和修改

1、将MySql中修改的数据同步到ES中 修改mysql中的数据 logstash中看到日志,修改的数据已经同步。 查看elasticsearch的数据 可以看到,ES中已经同步了MySql中的数据修改。 补充问题: 1、Logstash时间不是标准时间 2、Logstash与数据库时间相差8小时 修改conf默认时区为上海 cd /usr/loca...

Elasticsearch 建立ik中文分词器和自定义分词

一、建立ik中文分词器 1、下载ik中文分词器 进入https://github.com/medcl/elasticsearch-analysis-ik 使用第一种方式安装,进入https://github.com/medcl/elasticsearch-analysis-ik/releases 选择版本7.4.2 。和ES7.4.2的版本保持一致。...