SpringBoot集成elasticsearch

引入依赖

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

建立和客户端的elasticsearch连接

连接之前的操作


确认9090端口可以进行正常访问

/*** @message 与客户端的elasticSearch进行连接* @return 返回一个连接对象*/@Bean@Deprecatedpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));return  client;}

从容器中拿到这个restHighLevelClient对象

@Deprecated
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient restHighLevelClient;

创建一个索引并查看

  CreateIndexRequest request = new CreateIndexRequest("jia_sen");CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);System.out.println("==========》");System.out.println(response);System.out.println("==========》");System.out.println(request);
//        关闭连接restHighLevelClient.close();



elasticSearch 中新增加了一条索引

索引的获取以及判断索引是否存在

 GetIndexRequest request = new GetIndexRequest("jia_sen");boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);


反之如果不存在就会返回false

删除索引

DeleteIndexRequest request = new DeleteIndexRequest("jia_sen");
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
// 判断是否将创建的索引删除
System.out.println("==============="+response.isAcknowledged());

文档的操作

创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {private String name;private Integer age;
}
文档添加
Person person = new Person("家森", 21);
IndexRequest request = new IndexRequest("jia_index");
request.id("1");
request.timeout(TimeValue.timeValueMillis(1000));
request.source(JSON.toJSONString(person), XContentType.JSON);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.status());
System.out.println(request);


文档信息的获取

GetRequest request = new GetRequest("jia_index","1");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.toString());

文档信息的获取判断是否存在

 GetRequest request = new GetRequest("jia_index","1");
//      不获取返回 _source 的上下文信息request.fetchSourceContext(new FetchSourceContext(false));request.storedFields("_none_");boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);

文档的更新

    UpdateRequest request = new UpdateRequest("jia_index", "1");Person person = new Person("家森", 19);request.doc(JSON.toJSONString(person),XContentType.JSON);UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);System.out.println(response.status());//返回状态信息


文档的删除

 DeleteRequest request = new DeleteRequest("jia_index", "1");request.timeout("1s");DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);System.out.println(response);//返回状态信息


文档的搜索

    @Test@Deprecatedpublic void testSearch() throws IOException {//创建请求对象SearchRequest searchRequest = new SearchRequest();
//构建搜索条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//查询条件 使用QueryBuilders工具类创建
//精确查询TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "jiasen");
//匹配查询相当于模糊查询
//       MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
//设置高亮searchSourceBuilder.highlighter(new HighlightBuilder());
//设置分页
//        searchSourceBuilder.from();
//        searchSourceBuilder.size();
//设置一个过期时间searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//将条件放入查询构造器中searchSourceBuilder.query(termQueryBuilder);
//将条件添加到请求中去searchRequest.source(searchSourceBuilder);
//客户端查询请求SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = search.getHits();System.out.println("==================>"+JSON.toJSONString(hits));for (SearchHit documentFields : hits.getHits()) {System.out.println(documentFields.getSourceAsMap());}restHighLevelClient.close();}

批量添加指挥保留最后一个

 IndexRequest request = new IndexRequest("bulk");request.source(JSON.toJSONString(new Person("liu",1)),XContentType.JSON);request.source(JSON.toJSONString(new Person("min",2)),XContentType.JSON);request.source(JSON.toJSONString(new Person("kai",3)),XContentType.JSON);IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);

批量插入

        bulkRequest.timeout("10s");ArrayList<Person> peoples = new ArrayList<>();peoples.add(new Person("jiaSen1",18));peoples.add(new Person("jiaSen2",19));peoples.add(new Person("jiaSen3",12));peoples.add(new Person("jiaSen4",13));peoples.add(new Person("jiaSen5",14));peoples.add(new Person("jiaSen6",15));peoples.add(new Person("jiaSen7",16));for (int i = 0; i < peoples.size(); i++) {//数据信息bulkRequest.add(new IndexRequest("bulk")
//没有设置id会随机生成一个id.id(""+(i+1)).source(JSON.toJSONString(peoples.get(i)),XContentType.JSON));
//封装批量信息BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulk.status());}}

仿京东搜索项目搭建

需要引入的依赖

//请求的url地址String url="https://search.jd.com/Search?keyword=java";
//解析网页(jsoup 解析返回的对象是浏览器Document对象)Document document = Jsoup.parse(new URL(url), 30000);
//使用document可以使用js对document的所有操作
//获取元素(通过id)Element j_goodsList = document.getElementById("J_goodsList");
//获取J_goodsList ul中的每一个liassert j_goodsList != null;Elements lis = j_goodsList.getElementsByTag("li");
//获取li下的 img, price ,name
//因为图片是一个懒加载的过程所以加载图片时会先放在data-lazy-img中for (Element li : lis) {String img = li.getElementsByTag("img").eq(0).attr("data-lazy-img");String name = li.getElementsByClass("p-name").eq(0).text();String price = li.getElementsByClass("p-price").eq(0).text();System.out.println("=======================");System.out.println("img : " + img);System.out.println("name : " + name);System.out.println("price : " + price);}}


封装方法

public class HtmlParseUtil {public static List<Content> parseJD(String keyword) throws IOException {//请求的url地址String url="https://search.jd.com/Search?keyword="+keyword;
//解析网页(jsoup 解析返回的对象是浏览器Document对象)Document document = Jsoup.parse(new URL(url), 30000);
//使用document可以使用js对document的所有操作
//获取元素(通过id)Element j_goodsList = document.getElementById("J_goodsList");
//获取J_goodsList ul中的每一个liassert j_goodsList != null;Elements lis = j_goodsList.getElementsByTag("li");ArrayList<Content> contents = new ArrayList<>();
//获取li下的 img, price ,namefor (Element li : lis) {String img = li.getElementsByTag("img").eq(0).attr("data-lazy-img");String name = li.getElementsByClass("p-name").eq(0).text();String price = li.getElementsByClass("p-price").eq(0).text();Content content = new Content(name,img,price);contents.add(content);}return contents;}
}

service层中批量添加数据el

    @Deprecated@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient restHighLevelClient;/***        将网页信息批量添加进el中* @param  keywords 前端传入的关键字* @return !bulk.hasFailures();* @throws IOException 抛出ioe异常*/public Boolean parseContent(String keywords) throws IOException {List<Content> contents = HtmlParseUtil.parseJD(keywords);BulkRequest bulkRequest = new BulkRequest();for (Content content : contents) {bulkRequest.add(new IndexRequest("jd_goods").source(JSON.toJSONString(content), XContentType.JSON));}BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);return !bulk.hasFailures();}

controller层传参数

    private ContentService contentService;@Autowiredpublic void setContentService(ContentService contentService) {this.contentService = contentService;}@GetMapping("/parse/{keyword}")public String parse(@PathVariable String keyword) throws IOException {contentService.parseContent(keyword);return "index";}

遇到的问题

在 elasticsearch.yml 配置 xpack.security.enabled 为 false,然后重启 Elasticsearch:

xpack.security.enabled: false


将数据从el中查询出来(关键字高亮显示)

  /**** @param keyword 搜索的关键信息* @param pageIndex from* @param pageSize  size* @return  list集合*/public List<Map<String,Object>> highLightSearch(String keyword,Integer pageIndex,Integer pageSize) throws IOException {SearchRequest searchRequest = new SearchRequest("jd_goods");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 精确查询,添加查询条件TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", keyword);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));searchSourceBuilder.query(termQueryBuilder);
//查询分页searchSourceBuilder.from(pageIndex);searchSourceBuilder.size(pageSize);
//进行高亮设置HighlightBuilder highlightBuilder = new HighlightBuilder();
//高亮关键信息 并设置高亮字段的样式highlightBuilder.field("name");highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");searchSourceBuilder.highlighter(highlightBuilder);
//执行查询searchRequest.source(searchSourceBuilder);SearchResponse searchResponse= restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);SearchHits hits = searchResponse.getHits();List<Map<String, Object>> results = new ArrayList<>();for (SearchHit documentFields : hits.getHits()) {//使用高亮字段覆盖原来的字段Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();Map<String, HighlightField> highlightFields = documentFields.getHighlightFields();HighlightField name = highlightFields.get("name");
//替换if (name!=null){Text[] fragments = name.fragments();StringBuilder new_name = new StringBuilder();for (Text text : fragments) {new_name.append(text);}sourceAsMap.put("name",new_name.toString());}results.add(sourceAsMap);}return results;}

controller层

    @ResponseBody@GetMapping("/h_search/{keyword}/{pageIndex}/{pageSize}")public List<Map<String,Object>> highlightParse(@PathVariable("keyword") String keyword,@PathVariable("pageIndex") Integer pageIndex,@PathVariable("pageSize") Integer pageSize) throws IOException {return contentService.highLightSearch(keyword, pageIndex, pageSize);}

使用vue语法将后端数据进行渲染


观察京东给官网的操作我们只需要做一个div维护者一个ul 然后ul中将li进行数据遍历即可

使用vue将数据进行渲染

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"><head><meta charset="utf-8"/><title>狂神说Java-ES仿京东实战</title><link rel="stylesheet" th:href="@{/css/style.css}"/><script th:src="@{/js/jquery.min.js}"></script>
</head><body class="pg">
<div class="page"><div id="app" class=" mallist tmall- page-not-market "><!-- 头部搜索 --><div id="header" class=" header-list-app"><div class="headerLayout"><div class="headerCon "><!-- Logo--><h1 id="mallLogo"><img th:src="@{/images/jdlogo.png}" alt=""></h1><div class="header-extra"><!--搜索--><div id="mallSearch" class="mall-search"><form name="searchTop" class="mallSearch-form clearfix"><fieldset><legend>天猫搜索</legend><div class="mallSearch-input clearfix"><div class="s-combobox" id="s-combobox-685"><div class="s-combobox-input-wrap"><input v-model="keyword" type="text" autocomplete="off"  id="mq"class="s-combobox-input" aria-haspopup="true"></div></div><button type="submit" @click.prevent="searchKey" id="searchbtn">搜索</button></div></fieldset></form><ul class="relKeyTop"><li><a>狂神说Java</a></li><li><a>狂神说前端</a></li><li><a>狂神说Linux</a></li><li><a>狂神说大数据</a></li><li><a>狂神聊理财</a></li></ul></div></div></div></div></div><!-- 商品详情页面 --><div id="content"><div class="main"><!-- 品牌分类 --><form class="navAttrsForm"><div class="attrs j_NavAttrs" style="display:block"><div class="brandAttr j_nav_brand"><div class="j_Brand attr"><div class="attrKey">品牌</div><div class="attrValues"><ul class="av-collapse row-2"><li><a href="#"> 狂神说 </a></li><li><a href="#"> Java </a></li></ul></div></div></div></div></form><!-- 排序规则 --><div class="filter clearfix"><a class="fSort fSort-cur">综合<i class="f-ico-arrow-d"></i></a><a class="fSort">人气<i class="f-ico-arrow-d"></i></a><a class="fSort">新品<i class="f-ico-arrow-d"></i></a><a class="fSort">销量<i class="f-ico-arrow-d"></i></a><a class="fSort">价格<i class="f-ico-triangle-mt"></i><i class="f-ico-triangle-mb"></i></a></div><!-- 商品详情 --><div class="view grid-nosku"><div class="product"  v-for="result in results"><div class="product-iWrap"><!--商品封面--><div class="productImg-wrap"><a class="productImg"><img :src="result.img"></a></div><!--价格--><p class="productPrice"><em v-text="result.price"></em></p><!--标题--><p class="productTitle"><a v-html="result.name"></a></p><!-- 店铺名 --><div class="productShop"><span>店铺: 狂神说Java </span></div><!-- 成交信息 --><p class="productStatus"><span>月成交<em>999笔</em></span><span>评价 <a>3</a></span></p></div></div></div></div></div></div>
</div>
<script th:src="@{/js/vue.min.js}"></script>
<script th:src="@{/js/axios.min.js}"></script>
<script>import {axios} from "../static/js/axios.min";new Vue({el:"#app",data:{"keyword":'',"results":[]},methods:{searchKey(){let keyword=  this.keyword;console.log(keyword)axios.get('h_search/'+keyword+'/0/10').then(response=>{this.results=response.data;})}}});
</script></body>
</html>


**否则会出现DevTools 无法加载源映射: **

完结

SpringBoot集成ES+京东搜索相关推荐

  1. Java使用Springboot集成Es官方推荐(RestHighLevelClient)

    SpringBoot集成ElasticSearch的四种方式(主要讲解ES官方推荐方式) TransportClient:这种方式即将弃用 官方将在8.0版本彻底去除 Data-Es:Spring提供 ...

  2. SpringBoot 集成 ES 7.6.2 并对字段进行中文和拼音分词处理

    前言 在最近做的流媒体项目中需要集成 ES 搜索引擎,目前 ES 最新版本为 7.x 版本,在以往的项目中我都采用的是 spring 集成的 spring-data-es, 使用自定义类集成 elas ...

  3. ElasticSearch - SpringBoot集成ES

    文章目录 ElasticSearch - SpringBoot集成ES 1.整体设计思路(仿NBA中国官网) 2.项目搭建 3.ES API的基本使用 3.1 新增球员信息 3.2 查看球员信息 3. ...

  4. SpringBoot集成ES 7.6.2 并对字段进行中文和拼音分词处理

    文章目录 前言 一.为什么不用spring封装的spring-data-es? 二.springboot集成es的两种方式 1.spring-data-es使用elasticsearch 2.doc对 ...

  5. SpringBoot 集成ES集群CRUD及分页解决方案

    1 SpringBoot 集成ES集群 1.2 pom <parent><groupId>org.springframework.boot</groupId>< ...

  6. SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决

    SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决 错误: Caused by: org.springframework.beans.factory. ...

  7. ES整合SpringBoot并实现京东搜索

    目录 1.springboot整合ES 1.1 添加依赖 1.2 创建一个配置,获取ES工具类对象. 1.3 进行相关对ES操作 1.3.1 操作索引---创建索引 1.3.2 操作索引--删除索引 ...

  8. 从ElasticSearch 认识到实战(SpringBoot集成ES)

    ElasticSearch 认识到实战 目录 搜索引擎介绍 ElasticSearch知识 安装 使用restful风格查询ES SpringBoot配置ES SpringBoot集成使用 一.搜索引 ...

  9. springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 (1)是什么: Elasticsearc ...

最新文章

  1. linux开发神器--Tmux
  2. 学习Redis持久化
  3. tensorflow 查看graph
  4. 51nod1008 N的阶乘 mod P(水题)
  5. 清理系统垃圾的快捷方法
  6. 零基础如何学好数据分析?
  7. glide 压缩图拍呢_用Glide-图片的压缩-图片压缩原理
  8. Oracle 11gR2 RAC Service-Side TAF 配置示例
  9. C++之STL理论基础
  10. 全面容器化:阿里5年带给我的最大收获
  11. NHibernate Antlr.Runtime.NoViableAltException报错
  12. 职业方向网络词汇(不定时更新)
  13. 所谓厉害的人,遇到问题时的思维模式与我们的差别在哪?(转自知乎)
  14. (转)中国电信友华PT921、PT921G光猫设置路由,无线WIFI设置
  15. 论文笔记 Acquiring Common Sense Spatial Knowledge through Implicit Spatial Templates (AAAI2018)
  16. Android根据输入法的状态隐藏和关闭输入法
  17. 广东诚美计算机专修学院 概况,广州各大高校
  18. PS-图像处理:PS抠出图片中的图形轮廓渐变填充
  19. 学校教材订购系统课程设计
  20. Ubuntu20.04安装vivado2018.2过程中卡在generating installed device list的解决办法

热门文章

  1. js 获取汉字字符串长度
  2. 使用p5.js画一幅创意自画像
  3. Sed、Awk实用正则替换
  4. 南卡、华为哪个更好用?南卡和华为蓝牙耳机评测
  5. 怎样定义函数指针数组
  6. flutter全屏时钟!4年小Android的心路历程,搞懂这些直接来阿里入职
  7. 如何从0开始做甘特图?
  8. 用P5.js绘制一个看着鼠标的章鱼哥
  9. 创建项目Conda executable is not found
  10. GraphQL入门基础篇教程