1: ES 类似JPA操作

1.1 编写实体类

1.2 编写映射文件 xxx.json

1.3编写repository继承 ElasticSearchrepository

1.4 编写admin 的CRUD

2: 使用ElasticSearchtemplate 对索引操作

2.1 对索引的各类操作

3: 高级查询

配置application

##es 单个ES地址 #spring.data.elasticsearch.cluster-nodes= ## 设置ES多个地址
spring.data.elasticsearch.client.reactive.endpoints=[http://localhost:9200] ##
开启repositories spring.data.elasticsearch.repositories.enabled=true
#spring.data.elasticsearch.client.reactive.connection-timeout=
#spring.data.elasticsearch.client.reactive.password=
#spring.data.elasticsearch.client.reactive.socket-timeout=
#spring.data.elasticsearch.client.reactive.username= ##es 单个ES地址
#spring.data.elasticsearch.cluster-nodes=
## 设置ES多个地址
spring.data.elasticsearch.client.reactive.endpoints=[http://localhost:9200]
## 开启repositories
spring.data.elasticsearch.repositories.enabled=true
#spring.data.elasticsearch.client.reactive.connection-timeout=
#spring.data.elasticsearch.client.reactive.password=
#spring.data.elasticsearch.client.reactive.socket-timeout=
#spring.data.elasticsearch.client.reactive.username=

pom依赖

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

1: ES 类似JPA操作

1.1 编写实体类

// indexName: 索引名称  type: 执行数据库类型的表
@Document(indexName = "esadmin",type = "admin")
@Mapping(mappingPath = "admin_es.json") //指向映射文件
public class Admin { @Id
private Long id;
private String username;
private String password;
private String loveThings;
// getter setter 方法

1.2 编写映射文件 xxx.json

{
"properties": {
"id": {
"type": "long"
},
"username": {
"type": "string",
"index": "not_analyzed"
},
"password": {
"type": "string",
"index": "not_analyzed"
},
"loveThings": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}

1.3编写repository继承 ElasticSearchrepository

@Repository public interface AdminRepository extends
ElasticsearchRepository&lt;Admin,Long&gt; { }

1.4 编写admin 的CRUD

@RestController
public class AdminController { @Autowired
private AdminRepository adminRepository; // http://localhost:8080/saveOrUpdate /**
* send data
* {
* "username":"dgw3",
* "password":"root",
* "loveThings":"postman(二):使用postman发送get or post请"
* }
*/
@PostMapping("saveOrUpdate")
public String saveOrUpdate(@RequestBody Admin admin){
if(admin.getId()==null){
admin.setId(System.currentTimeMillis());
}
adminRepository.save(admin);
return "保存成功";
}
//http://localhost:8080/delete?id=1582946734759
@GetMapping("delete")
public String delete(Long id){
try {
adminRepository.deleteById(id);
} catch (Exception e) {
e.printStackTrace();
return "删除失败";
}
return "删除成功";
}
//http://localhost:8080/findById?id=1582946734759
@GetMapping("findById")
public Admin findById(long id){
Optional<Admin> admin = adminRepository.findById(id);
if(admin.isPresent()){
return admin.get();
}else{
return null;
}
}
//http://localhost:8080/findAll
@GetMapping("findAll")
public Iterable<Admin> findAll(){
return adminRepository.findAll();
}
}

2: 使用ElasticSearchtemplate 对索引操作

2.1 对索引的各类操作

@RestController
public class ElasticOperationControler { @Autowired
private ElasticsearchTemplate elasticsearchTemplate; @GetMapping("createIndex")
public boolean createIndex(String indexName){
return elasticsearchTemplate.createIndex(indexName);
} @GetMapping("deleteIndex")
public boolean deleteIndex(String indexName){
return elasticsearchTemplate.deleteIndex(indexName);
} @GetMapping("indexIsExist")
public boolean indexIsExist(String indexName){
return elasticsearchTemplate.indexExists(indexName);
} @GetMapping("typeIsExist")
public boolean typeIsExist(String indexName,String type){
return elasticsearchTemplate.typeExists(indexName,type);
} @GetMapping("getMapping")
public Map getMapping(String indexName, String type){
return elasticsearchTemplate.getMapping(indexName,type);
} @GetMapping("getSetting")
public Map getSetting(String indexName){
return elasticsearchTemplate.getSetting(indexName);
}
}

3: 高级查询

查询步骤:

  • QueryBuilders 构建查询关键词
  • SortBuilders 构建对关键字的排序
  • NativeSearchQueryBuilder 对前两个条件进行封装,
  • Repository : 进行查询
@RestController
public class SearchController { @Autowired
private ElasticsearchTemplate elasticsearchTemplate; @Autowired
private ArticleRepository articleRepository; //1.不分词查询:查询articleContent带有你好 或者 articleName带有你好的文章列表,并且按照readCount倒叙排序
//http://localhost:8080/query1?keyword=你好
@GetMapping("query1")
public List<Article> query1(String keyword) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); BoolQueryBuilder articleContent = boolQuery.should(QueryBuilders.termQuery("articleContent", keyword));
BoolQueryBuilder articleName = boolQuery.should(QueryBuilders.termQuery("articleName", keyword)); FieldSortBuilder order = SortBuilders.fieldSort("readCount").order(SortOrder.DESC); NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder(); nativeSearchQueryBuilder.withQuery(articleContent);
nativeSearchQueryBuilder.withQuery(articleName);
nativeSearchQueryBuilder.withSort(order); NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build(); Page<Article> articles = articleRepository.search(searchQuery);
if (articles != null) {
return articles.getContent();
} else {
return null;
}
}
//2.不分词查询:查询articleContent带有我们 或者 你好 并且authorAge在20岁以下的文章列表,并且按照readCount倒叙排序
//http://localhost:8080/query11?keyword=你好,我们
@GetMapping("query2")
public List<Article> query2(String... keyword) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.termsQuery("articleContent", keyword));
boolQueryBuilder.must(QueryBuilders.rangeQuery("authorAge").lt(20));
FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort("readCount").order(SortOrder.DESC);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
nativeSearchQueryBuilder.withSort(fieldSortBuilder);
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
Page<Article> page = articleRepository.search(nativeSearchQuery);
if (page != null) {
return page.getContent();
} else {
return null;
}
} //3.分词查询:经过分词,查询articleContent带有你好节日一词分词后的文章列表,并且按照authorAge倒叙排序
//http://localhost:8080/query12?keyword=你好节日
@GetMapping("query3")
public List<Article> query3(String keyword) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("articleContent", keyword));
FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort("authorAge").order(SortOrder.DESC);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
nativeSearchQueryBuilder.withSort(fieldSortBuilder);
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
Page<Article> page = articleRepository.search(nativeSearchQuery);
if (page != null) {
return page.getContent();
} else {
return null;
}
} //4.分页分词查询:经过分词,查询articleContent带有你好节日一词分词后的文章列表,并且按照authorAge倒叙排序
//http://localhost:8080/query13?keyword=你好节日&pageNum=1&pageSize=5
@GetMapping("query4")
public Page<Article> query4(String keyword, Integer pageNum, Integer pageSize) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("articleContent", keyword));
FieldSortBuilder fieldSortBuilder = SortBuilders.fieldSort("authorAge").order(SortOrder.DESC);
PageRequest pageRequest = new PageRequest(pageNum, pageSize);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(boolQueryBuilder);
nativeSearchQueryBuilder.withSort(fieldSortBuilder);
nativeSearchQueryBuilder.withPageable(pageRequest);
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
Page<Article> page = articleRepository.search(nativeSearchQuery);
if (page != null) {
return page;
} else {
return null;
}
} //5.分页分词查询:经过分词,查询articleContent带有你好节日一词分词后的文章列表,并且按照authorAge倒叙排序,并且对匹配到的词语设置为高亮
//http://localhost:8080/query14?keyword=你好节日&pageNum=1&pageSize=5&fieldNames=articleContent,articleName
@GetMapping("query5")
public Map<String, Object> query5(String keyword, Integer pageNum, Integer pageSize, String... fieldNames) { //定义返回的map
Map<String, Object> returnMap = new HashMap<String,Object>(); // 不使用默认的分词器 直接操控索引
//构建请求构建器,设置查询索引
SearchRequestBuilder builder = elasticsearchTemplate.getClient().prepareSearch("testes"); //构建查询构建器,设置分词器(如果没设置使用默认)
QueryBuilder matchQuery = QueryBuilders.multiMatchQuery(keyword, fieldNames).analyzer("ik_max_word"); //构建高亮构建器
HighlightBuilder highlightBuilder = new HighlightBuilder().field("*").requireFieldMatch(false);
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>"); //将高亮构建器,查询构建器,分页参数设置到请求构建器内
builder.highlighter(highlightBuilder);
builder.setQuery(matchQuery);
builder.setFrom((pageNum - 1) * pageSize);
builder.setSize(pageNum * pageSize);
builder.setSize(pageSize); //执行搜索,返回搜索响应信息
SearchResponse searchResponse = builder.get();
SearchHits searchHits = searchResponse.getHits(); //总命中数
long total = searchHits.getTotalHits();
returnMap.put("count", total); //将高亮字段封装到返回map
SearchHit[] hits = searchHits.getHits();
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map;
for(SearchHit searchHit : hits){
map = new HashMap<>();
map.put("data",searchHit.getSourceAsMap());
Map<String,Object> hitMap = new HashMap<>();
searchHit.getHighlightFields().forEach((k,v) -> {
String hight = "";
for(Text text : v.getFragments()){
hight += text.string();
}
hitMap.put(v.getName(),hight);
});
map.put("highlight",hitMap);
list.add(map);
}
returnMap.put("dataList", list);
return returnMap;
}

ElasticSearch系列四 CURD的更多相关文章

  1. elasticsearch系列四:搜索详解(搜索API、Query DSL)

    一.搜索API 1. 搜索API 端点地址 从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy 从索引tweet,user里 ...

  2. Elasticsearch入门教程(四):Elasticsearch文档CURD

    原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...

  3. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  4. 前端构建大法 Gulp 系列 (四):gulp实战

    前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...

  5. ElasticSearch第四步-查询详解

    ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...

  6. Netty4.x中文教程系列(四) 对象传输

    Netty4.x中文教程系列(四)  对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...

  7. S5PV210开发系列四_uCGUI的移植

    S5PV210开发系列四 uCGUI的移植 象棋小子          1048272975 GUI(图形用户界面)极大地方便了非专业用户的使用,用户无需记忆大量的命令,取而代之的是能够通过窗体.菜单 ...

  8. WCF编程系列(四)配置文件

    WCF编程系列(四)配置文件   .NET应用程序的配置文件 前述示例中Host项目中的App.config以及Client项目中的App.config称为应用程序配置文件,通过该文件配置可控制程序的 ...

  9. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

随机推荐

  1. 二、Shell脚本高级编程实战第二部

    一.什么是变量? 变量就是一个固定的字符串替代更多更复杂的内容,当然内容里面可能还有变量.路径.字符串等等内容,最大的特点就是方便,更好开展工作 1.变量有环境变量(全局变量)和局部变量 环境变量就是 ...

  2. Kattis - intersectingrectangles 扫描线+线段树

    题目:https://open.kattis.com/problems/intersectingrectangles 题意::给你n个矩形,每一个矩形给你这个矩形的左下角的坐标和右上角的坐标,然后问你 ...

  3. Python语言学习前提:基础语法

    一.变量 1.变量:存储数据.存储数据需要对应内存空间,基于变量的数据类型,解释器会分配指定内存,决定什么数据被存储到内存中. 变量数据类型:整数.小数.字符. 2.变量赋值:变量在使用前必须赋值,赋 ...

  4. 【转】Linux虚拟终端命令Screen用法详解

    转自 http://www.linuxidc.com/Linux/2013-07/87415.htm 在使用ssh或者telnet登录远程主机后,执行一些耗时的命令,如果此时ssh或者telnet中断 ...

  5. 【转】nginx如何设置防盗链

    转自博客园作者:howhy,文章地址:nginx如何设置防盗链.大佬写的甚好,在此备份一下 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底 ...

  6. 1)关于配置centos的网络问题

    网址: http://jingyan.baidu.com/article/f3e34a12d886d2f5eb653515.html

  7. linux配置和查看环境变量

    环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文件夹位置等等. 一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要 ...

  8. 各大厂RTSP取流的URI

    目前使用过的各大厂商取流规则是在实际的工作中遇到的相关视频接入问题,通过rtsp协议接入视频数据的一些记录,其中的图片可能来源于网络,内容部分来源于网络,本人仅仅是对相关内容作了汇总. 海康RTSP取 ...

  9. python学习笔记(5)数据类型-字典

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...

  10. Java IO: 序列化与ObjectInputStream、ObjectOutputStream

    作者:Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和O ...