0%

Spring整合Elasticsearch

  • 引入依赖
    • spring-boot-starter-data-elasticsearch
  • 配置Elasticsearch
    • cluster-name,cluster-nodes
  • Spring Data Elasticsearch
    • ElasticsearchTemplate
    • ElasticsearchRepository

定义Repository接口

  • DAO层实现实体类对应的Repository接口,继承于ElasiticsearchRepository,泛型为实体和id类型
  • 父接口中已经定义好了对es服务器的增删改查方法,不需要自己实现

测试增删改查方法

  • save方法,保存一条
  • saveAll,保存多条
  • save覆盖即可
  • deleteById
  • 首先构造搜索请求对象SearchRequest,传入索引名
  • 构造搜索条件SearchSourceBuilder
1
2
3
4
5
6
7
8
9
10
11
12
//构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
//在discusspost索引的title和content字段中都查询“互联网寒冬”
.query(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
// matchQuery是模糊查询,会对key进行分词:searchSourceBuilder.query(QueryBuilders.matchQuery(key,value));
// termQuery是精准查询:searchSourceBuilder.query(QueryBuilders.termQuery(key,value));
.sort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
.sort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
.sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
//一个可选项,用于控制允许搜索的时间:searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
.from(0)// 指定从哪条开始查询
.size(10);// 需要查出的总记录条数
  • 调用searchRequest的source方法,将搜索条件传入请求体
  • 创建应答对象
1
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  • 转换为json格式输出

  • 添加高亮

    • 声明高亮对象
    1
    2
    3
    4
    5
    6
    7
    //高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("title");
    highlightBuilder.field("content");
    highlightBuilder.requireFieldMatch(false);
    highlightBuilder.preTags("<span style='color:red'>");
    highlightBuilder.postTags("</span>");
    • 遍历时处理高亮
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 处理高亮显示的结果,获取高亮数据进行进行替换
    // 可能有多段匹配,取第一段即可
    HighlightField titleField = hit.getHighlightFields().get("title");
    if (titleField != null) {
    discussPost.setTitle(titleField.getFragments()[0].toString());
    }
    HighlightField contentField = hit.getHighlightFields().get("content");
    if (contentField != null) {
    discussPost.setContent(contentField.getFragments()[0].toString());
    }
------ THEEND ------

欢迎关注我的其它发布渠道