SpringBoot整合《Redis》和《Elasticsearch》并在项目中使用 (亲测可用!)

一、SpringBoot整合Redis

一、导入依赖

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

二、添加配置

application.yml

# redis配置  默认密码为空
  redis:
    database: 0
    host: localhost
    port: 6379
    password:

或者是 application.properties

# redis配置  默认密码为空
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=

三、在项目中使用

注意:需保持本地redis处于运行状态

以查询所有数据为例:

    @Autowired
    RedisTemplate redisTemplate;
    @Autowired
    TBlogMapper tBlogMapper;

    @Override
    public List<TBlog> findAllBlog() {
    	//定义key
        String key = "findAllBlog";
        ValueOperations<String,List<TBlog>> operations = redisTemplate.opsForValue();
        boolean hasKey = redisTemplate.hasKey(key);
        //如果有缓存,就从redis中取数据;否则就先查询数据库,再把数据存入redis中。
        if (hasKey){
        	List<TBlog> blogList = operations.get(key);
            return blogList ;
        }else {
            List<TBlog> blogList = tBlogMapper.findAllBlog();
            //存入redis 1小时过期
            operations.set(key,blogList,1,TimeUnit.HOURS); 
            return blogList;
        }

    }

二、SpringBoot整合Elasticsearch

1、导入依赖

        <!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.5.4</version>
        </dependency>
        
        <!-- elasticsearch高级API -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.5.4</version>
        </dependency>
        
        <!-- jackson 格式转换 -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

2、配置连接es

新建工具类 EsClient.java

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

public class EsClient {

    public static RestHighLevelClient getClient(){
        //  创建 HttpHost
        HttpHost httpHost = new HttpHost("localhost",9200);

        // 创建 RestClientBuilder
        RestClientBuilder builder = RestClient.builder(httpHost);

        // 创建 RestHighLevelClient
        RestHighLevelClient client = new RestHighLevelClient(builder);

        return client;
    }
}

3、添加数据

注意:需保持本地的 elasticsearch 处于运行状态

这里演示的是在测试类添加数据:

    @Autowired
    KeyWordService keyWordService;

    ObjectMapper mapper = new ObjectMapper();
    RestHighLevelClient client =  EsClient.getClient();  //连接ES
    String index = "keywordlist";  //索引
    String type="keyword";   //类型

    /**
     * 添加文章数据
     * @throws IOException
     */
    @Test
    public void addDOC2() throws IOException{
    
        //  1.准备一个json数据
        List<KeyWord> keyWordList = keyWordService.findAll();
        
        for (int i = 0; i < keyWordList.size(); i++) {
        
            String json = mapper.writeValueAsString(keyWordList.get(i));
            
            //  2.创建一个request对象(手动指定的方式创建)
            IndexRequest request = new IndexRequest(index,type,keyWordList.get(i).getKwid());
            
            request.source(json, XContentType.JSON);

            // 3.使用client 操作request对象生成doc
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            
            // 4.输出返回结果
            System.out.println(response.getResult().toString());
        }
    }

4、在Kibana中查看

Kibana安装:https://blog.csdn.net/m0_45234510/article/details/109509529

访问:http://localhost:5601/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、新建EsBlogService类

import java.util.ArrayList;
import java.util.Map;

public interface EsBlogService {
    ArrayList<Map<String,Object>> findByEsBlog(String eskeyword);
}

6、新建EsBlogServiceImpl类

import lombok.SneakyThrows;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Map;

@Service
public class EsBlogServiceImpl implements EsBlogService {

    RestHighLevelClient restHighLevelClient =  EsClient.getClient();  // 连接ES
    String index = "bloglist";   // 索引
    String type="blog";           // 类型


    /**
     * 根据关键词查询
     * @param eskeyword
     * @return
     */
    @SneakyThrows
    @Override
    public ArrayList<Map<String,Object>> findByEsBlog(String eskeyword) {
        //1.创建request对象
        SearchRequest searchRequest = new SearchRequest(index);
        searchRequest.types(type);
        //2.指定查询条件
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //关键词查询
        builder.query(QueryBuilders.matchPhraseQuery("title",eskeyword));
        
        //高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title");
        highlightBuilder.requireFieldMatch(false); //多个高亮显示
        highlightBuilder.preTags("<span style='color:red'>");  //标签开始
        highlightBuilder.postTags("</span>");  //标签结束
        builder.highlighter(highlightBuilder);

        searchRequest.source(builder);
        
        //执行查询
        SearchResponse rsp = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        //存放数据
        ArrayList<Map<String,Object>> blogList = new ArrayList<>();
        for (SearchHit hit:rsp.getHits().getHits()) {
            //处理高亮
            Map<String,HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField title = highlightFields.get("title");
            Map<String,Object> sourceAsMap = hit.getSourceAsMap(); //原来的结果
            //解析高亮的字段,将原来的字段替换为我们高亮的字段即可
            if (title != null){
                Text[] fragments = title.fragments();
                String new_title = "";
                for (org.elasticsearch.common.text.Text text:fragments) {
                    new_title += text;
                }
                sourceAsMap.put("title",new_title); //高亮字段替换原来的内容
            }
            
            blogList.add(hit.getSourceAsMap());
        }
        //返回数据
        return blogList;
    }
}

7、新建EsBlogController类

import com.xlblog.blog.utils.RespBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Map;

@RestController
@RequestMapping("/es")
public class EsBlogController {

    private RespBean respBean;
    @Autowired
    EsBlogService esBlogService;

    @ModelAttribute
    public void init() {
        respBean = new RespBean();
    }

    /**
     * 根据关键词查询
     * @param keyword
     * @return
     */
    @GetMapping("/findByTitle")
    public RespBean EsKeywordList(String keyword){
        ArrayList<Map<String,Object>> blogList = esBlogService.findByEsBlog(keyword);
        if (blogList != null){
            respBean.setObj(blogList);
        }else {
            respBean.setMsg("没有数据");
        }
        return respBean;
    }
}

8、测试

http://localhost:8082/es/findByTitle?keyword=旅游

关键词高亮:
在这里插入图片描述

http://localhost:8082/es/findByTitle?keyword=redis
在这里插入图片描述

9、前端渲染

<h4 v-html="item.title"></h4>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值