关键词:
需要学习基础的可参照这两文章
Elasticsearch 学习+SpringBoot实战教程(一)
Elasticsearch 学习+SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客
Elasticsearch 学习+SpringBoot实战教程(二)
前言: 经过了前面2课的学习我们已经大致明白了ES怎么使用,包括原生语句,javaapi等等,现在我们要在业务中使用了,
所以我们选择spring-data作为我们的ORM框架,快速开发代码。
同时需要给规范化操作
目录
1 使用ElasticsearchOperations的方式
0 前置动作
1 Springboot项目引入依赖
注意你的ES版本号
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.20</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.1</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.10.1</version>
</dependency>
2 建立目录与文件
3 配置文件
spring:
elasticsearch:
uris: localhost:9200
connection-timeout: 3000
socket-timeout: 5000
4 实体类
package com.example.eslearn.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
/**
* Document: 将这个类对象转为 es 中一条文档进行录入
* indexName: 用来指定文档的索引名称
* createIndex: 用来指定是否创建索引,默认为false
*/
@Document(indexName = "user", createIndex = true)
public class UserDocument implements Serializable
@Id // 用来将放入对象id值作为文档_id进行映射
private String id;
@Field(type = FieldType.Keyword) // 字段映射类型
private String name;
private String sex;
private Integer age;
@Field(type = FieldType.Text) // 字段映射类型
private String city;
1 使用ElasticsearchOperations的方式
优点:更想我们的springdata的使用风格,简单,快捷,个人使用
新增文档
private final ElasticsearchOperations ESO;
// set方法注入
@Autowired
public CRUDService2(ElasticsearchOperations elasticsearchOperations)
this.ESO = elasticsearchOperations;
// 新增文档
public String save()
UserDocument user = new UserDocument();
user.setName("说不定看见的");
user.setCity("北京 上海 西安");
user.setAge(22);
user.setSex("男");
UserDocument save = ESO.save(user);
System.out.println(save);
return JSON.toJSONString(save);
使用可视化软件查询,得到下面的结果
更新文档
// 更新文档
public String update()
UserDocument user = new UserDocument();
user.setId("W7w2HYcB32f1ZLmxRwzw");
user.setName("说快来打见的");
user.setCity("北京 上海 西安");
user.setAge(21);
user.setSex("女");
UserDocument save = ESO.save(user);
System.out.println(save);
return JSON.toJSONString(save);
删除文档
// 删除
public String delete()
UserDocument userDocument = new UserDocument();
userDocument.setId("8966e506-1763-4d4b-bf1c-4f5d9bd9b052");
return ESO.delete(userDocument);
查询所有
// 查询所有
public String findAll()
//查询所有
SearchHits<UserDocument> search = ESO.search(Query.findAll(), UserDocument.class);
for (SearchHit<UserDocument> uc : search)
System.out.println(uc.getContent());
return JSON.toJSONString(search);
查询指定id
// 根据id查询文档
public String getById()
UserDocument userDocument = ESO.get("W7w2HYcB32f1ZLmxRwzw", UserDocument.class);
return JSON.toJSONString(userDocument);
分页+指定条件+高亮显示+排序+过滤结果
服务层
//大杂烩,一次学会
public String findSource()
//查询条件构建
MatchQueryBuilder mp=new MatchQueryBuilder("name","妲己");
//排序构建
FieldSortBuilder f = new FieldSortBuilder("age");
//分页构建
Pageable page= PageRequest.of(0,5);
// 高亮构建
HighlightBuilder highlightBuilder = new HighlightBuilder()
.preTags("<span style='color:yellow'>")
.postTags("</span>")
.field("name");
//结果过滤构建,相当于返回那些字段
FetchSourceFilter filter = new FetchSourceFilter(new String[]"name", "city", null);
//查询语句构建
NativeSearchQueryBuilder query = new NativeSearchQueryBuilder()
.withQuery(mp)
.withSorts(f)
.withPageable(page)
.withHighlightBuilder(highlightBuilder)
.withSourceFilter(filter);
//执行查询
SearchHits<UserDocument> search = ESO.search(query.build(), UserDocument.class);
return JSON.toJSONString(search);
控制器
@GetMapping("/findSource")
private String findSource()
return sv.findSource();
2 使用RestHighLevelClient的方式
优点:安全,企业级常用
精确查询
对应的原生查询语句
注意这里的term就是精准查询到 关键字
GET user/_search
"query":
"term":
"city": "上海"
服务层
// 文档搜索
public String searchDocument(String indexName,String city)
//2 构建搜索请求
SearchRequest searchRequest = new SearchRequest().indices(indexName);
//3 构建搜索内容
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("city", city);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(termQueryBuilder);
//4 填充搜索内容
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try
//5 执行搜索操作
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
catch (IOException e)
throw new RuntimeException(e);
//6 返回值
return JSON.toJSONString(searchResponse.getHits().getHits());
控制器
@GetMapping("/searchUserByCity")
public String searchUserByCity() throws IOException
return service.searchDocument("user","上海");
访问链接localhost:8080/searchUserByCity
分页查询
GET user/_search
"query":
"term":
"city": "上海"
,
"from":0,
"size":5
服务层
// 文档搜索--分页查询
public String searchDocument2(String indexName,String city)
//2 构建搜索请求
SearchRequest searchRequest = new SearchRequest().indices(indexName);
//3 构建搜索内容
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//拿到前5条数据
searchSourceBuilder
.query(QueryBuilders.termQuery("city", city))
.from(0)
.size(5);
//4 填充搜索内容
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try
//5 执行搜索操作
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
catch (IOException e)
throw new RuntimeException(e);
//6 返回值
return JSON.toJSONString(searchResponse.getHits().getHits());
控制层
@GetMapping("/searchUserByCity2")
public String searchUserByCity2() throws IOException
return service.searchDocument2("user","上海");
访问localhost:8080/searchUserByCity2
字符匹配AND精准查询
term 与matchphrase的比较 term用于精确查找有点像 mysql里面的"=" match是先将查询关键字分词然后再进行查找。term一般用在keywokrd类型的字段上进行精确查找。
注意这里的bool,表示使用布尔查询,其中的must是相当于SQL语句中的and的意思。
所以就是查找name中包含“妲己”并且年龄为22岁的信息,请注意不能写成"妲",因为我们在新建文档的时候是这样新建的“妲己”,那么我们如果匹配“妲”就会匹配不到,加入这样写就可以匹配到了“妲 己”,请注意空格,这是分词的依据之一
ES查询语句。
GET user/_search
"query":
"bool":
"must": [
"match_phrase":
"name": "妲己"
,
"term":
"age": "32"
]
,
"from":0,
"size":10
服务层
// 文档分词搜索+精确查询
public String searchDocument3(String indexName,String name,Integer age)
//2 构建搜索请求
SearchRequest searchRequest = new SearchRequest().indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//3 构建复杂的查询语句
BoolQueryBuilder bq=QueryBuilders
.boolQuery()
//分词匹配
.must(QueryBuilders.matchPhraseQuery("name",name))
//精确匹配
.must(QueryBuilders.matchQuery("age",age));
//4 填充搜索语句
searchSourceBuilder
.query(bq)
.from(0)
.size(5);
//4 填充搜索内容
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try
//5 执行搜索操作
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
catch (IOException e)
throw new RuntimeException(e);
//6 返回值
return JSON.toJSONString(searchResponse.getHits());
控制层
@GetMapping("/searchUser3")
public String searchUser3() throws IOException
return service.searchDocument3("user","妲己",32);
字符匹配OR精准查询
原始查询语句
GET user/_search
"query":
"bool":
"should": [
"match_phrase":
"name": "妲己"
,
"term":
"age": "32"
]
,
"from":0,
"size":10
服务层
// 文档分词搜索OR精确查询
public String searchDocument4(String indexName,String name,Integer age)
//2 构建搜索请求
SearchRequest searchRequest = new SearchRequest().indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//3 构建复杂的查询语句
BoolQueryBuilder bq=QueryBuilders
.boolQuery()
//分词匹配
.should(QueryBuilders.matchPhraseQuery("name",name))
//精确匹配
.should(QueryBuilders.matchQuery("age",age));
//4 填充搜索语句
searchSourceBuilder
.query(bq)
.from(0)
.size(5);
//4 填充搜索内容
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try
//5 执行搜索操作
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
catch (IOException e)
throw new RuntimeException(e);
//6 返回值
return JSON.toJSONString(searchResponse.getHits());
控制层
@GetMapping("/searchUser4")
public String searchUser4() throws IOException
return service.searchDocument4("user","妲己",22);
结果
模糊查询
原始语句
GET user/_search
"query":
"wildcard":
"city":
"value": "上*"
// 文档模糊查询
public String searchDocument5(String indexName,String city)
//2 构建搜索请求
SearchRequest searchRequest = new SearchRequest().indices(indexName);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//3 构建模糊查询的语句
WildcardQueryBuilder bq=QueryBuilders
.wildcardQuery("city",city);
//4 填充搜索语句
searchSourceBuilder
.query(bq);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = null;
try
//5 执行搜索操作
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
catch (IOException e)
throw new RuntimeException(e);
//6 返回值
return JSON.toJSONString(searchResponse.getHits());
@GetMapping("/searchUser5")
public String searchUser5() throws IOException
return service.searchDocument5("user","上*");
结果
elasticsearch学习+springboot实战教程(代码片段)
需要学习基础的可参照这两文章Elasticsearch学习+SpringBoot实战教程(一)Elasticsearch学习+SpringBoot实战教程(一)_桂亭亭的博客-CSDN博客Elasticsearch学习+SpringBoot实战教程(二) Elasticsearch学习+Sprin... 查看详情
elasticsearch搜学习笔记
Elasticsearch学习笔记B站【尚硅谷】ElasticSearch入门到精通2021最新教程学习文档下载链接常用APIforpostman 查看详情
elasticsearch学习笔记
在学习elasticsearch之前,我们先要弄清楚几个问题,就是what,why和how1.what-------elasticsearch是什么 官方概念:elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsear... 查看详情
elasticsearch学习springboot整合elasticsearch的原生方式
前面我们已经介绍了springboot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是Elasticsearch聚合操作的一个基础。一、修改spr... 查看详情
elasticsearch入门+基础概念学习
原文地址:https://www.cnblogs.com/shoufeng/p/9887327.html目录1Elasticsearch概述1.1Elasticsearch是什么1.2Elasticsearch的优点1.3Elasticsearch的相关产品1.4Elasticsearch的使用场景2Elasticsearch的功能概述2.1分布式的搜索引擎和数据分析引擎2.2全文检索结构... 查看详情
elasticsearch学习笔记一
一.Elasticsearch简介 Elasticsearch是基于ApacheLucene的开源的搜索引擎。支持时间检索和全文检索。二.安装下载来自http://www.elasticsearch.org/download/的ElasticSearch。 w 查看详情
elasticsearch学习记录
参考资料:ElasticSearch大数据分布式弹性搜索引擎使用ELK日志分析平台搭建全过程ELK日志监控平台环境搭建及使用说明 查看详情
elasticsearch学习
前言:ES学习可参考《Elasticsearch:权威指南》,这个在线电子书内容介绍的很是详细官网 https://www.elastic.co/中文社区 http://elasticsearch.cn/ 目录安装安装插件配置CURL命令JAVAAPI其他 安装首先我们需要去官网下载安... 查看详情
elasticsearch学习笔记elasticsearch及elasticsearchhead安装配置(代码片段)
一、安装与配置1、到官网下载Elasticsearch,https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.zip2、解压成三分份3、下载Elasticsearch的管理工具 https://codeload.github.com/mobz/elasticsearch-head/zip/mast 查看详情
elasticsearch入门学习:使用javaapi学习es
一、Maven依赖<!--刚开始少这个包创建索引失败ValidationFailed:1:typeismissing;官方文档并没有给这个提示--><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId>< 查看详情
(转)elasticsearch学习
(二期)21、全文搜索引擎Elasticsearch【课程21】elasticsearch.xmind82.1KB【课程21】lucene.xmind0.8MB【课程21】基本用法....api.xmind83.2KB【课程21预习】全...arch.xmind0.4MB Lucene为了更深入地理解ElasticSearch的工作原理,特别是索引和查询这... 查看详情
elasticsearch-尚硅谷(9.面试题)学习笔记
...:(8.优化)学习笔记文章目录1为什么要使用Elasticsearch?2Elasticsearch的master选举流程?3Elasticsearch集群脑裂问题?4Elasticsearch索引文档的流程?5Elasticsearch更新和删除文档的流程?6Elasticsearch搜索的流 查看详情
elasticsearch学习笔记-03探索集群
...据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_exploring_your_cluster.htmlRESTAPI现在咱们已经成功让Elasticsearch的节... 查看详情
elasticsearch学习
Elasticsearch研究有一段时间了,现特将Elasticsearch相关核心知识、原理从初学者认知、学习的角度,从以下9个方面进行详细梳理。欢迎讨论……0.带着问题上路——ES是如何产生的?(1)思考:大规模数据如何检索?如:当系统数... 查看详情
elasticsearch学习2--elasticsearch数据类型简介
1.Elasticsearch是 面向文档型数据库,这意味着它存储的是整个对象或者 文档,它不但会存储它们,还会为他们建立索引,这样你就可以搜索他们了。你可以在Elasticsearch中索引、搜索、排序和过滤这些文档。不需要成行成... 查看详情
elasticsearch学习笔记-02安装
...据官方文档的翻译,能力有限、水平一般,如果对想学习Elasticsearch的朋友有帮助,将是本人的莫大荣幸。原文出处:https://www.elastic.co/guide/en/elasticsearch/reference/current/_installation.htmlElasticsearch要求Java最低版本为8.截止本文撰写的时... 查看详情
elasticsearch学习笔记elasticsearch分布式机制
一、Elasticsearch对复杂分布式机制透明的隐藏特性 1、分片机制: (1)index包含多个shard,每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的... 查看详情
[elasticsearch]螺丝刀学习笔记之——elasticsearch(7.0up学习概览)(代码片段)
...呢?这不,压箱底的两篇学习笔记其中之一——ElasticSearch学习概览,就此JI出~~,祝自己和各位猿族兄嘚们节日快乐,同时欢迎各位猿友们一起交流指正~~🐵😘什么是ES?ES是一种开源、RESTful& 查看详情