ElasticSearch学习笔记(二)
################################################################## 查询名字中有王 且 过滤 筛选中age>10岁的
GET wang/user/_search
{"query": {"bool": {"must": [{"match": {"name": "王"}}],"filter": {"range": {"age": {"gt": 10}}}}}
}
#### gt大于 gte大于等于 lt小于 lte小于等于
GET wang/user/_search
{"query": {"bool": {"must": [{"match": {"name": "王"}}],"filter": {"range": {"age": {"gte": 10, #大于等于10岁"lt": 26 #小于26岁}}}}}
}
匹配多个搜索条件
################################################################### 多个条件查询
#### 含有渣的都会被搜索出来,只要满足一个结果就可以查出来
### 渣男渣女都能查出来 两个都符合 分数比较高,权重高
### 多个条件 空格隔开
GET wang/user/_search
{"query": {"match": {"tags": "渣 技术"}}
}
精确查询
term查询是直接通过倒排索引指定的词条进程精确查找的
关于分词:
- 直接查询精确的
- match 会使用分词器去解析(先分析文档,然后在通过分析的文档进行查询)
那我们要了解我们有两个类型的数据是text,keyword
怎么理解呢
################################################################### 创建索引数据库
PUT testdb
{"mappings":{"properties": {"name":{"type": "text" #name是text类型},"desc":{"type":"keyword" #desc是keyword类型}}}
}
############# 存放数据
PUT testdb/_doc/1
{"name":"狂神说Java name","desc":"狂神说Java desc"
}
PUT testdb/_doc/2
{"name":"狂神说Java name","desc":"狂神说Java desc2"
}
######## 查找
GET _analyze
{"analyzer": "keyword","text": "狂神说Java name" #如果是keyword,就不会拆分
}
GET _analyze
{"analyzer":"standard", #普通类型则会拆分 被拆分成了一个个字"text": "狂神说Java name"
}######## 复杂查询测试
GET testdb/_search
{"query": {"term": {"name": "狂"}}
} ### 结果会被查询出来,因为上面的name是text类型,会被分 词器解析,只要包含这个字,就能查出来
# desc是keyword 那我搜他的子句能搜到么
GET testdb/_search
{"query": {"term": {"desc": "狂神说Java desc"}}
} ##只有1条数据出来了 狂神说Java desc2 没有被查出来
因此得出我们的结论,类型为keyword的字段是不会被分词器解析的
多个值匹配的精确查询
###### 构造数据
PUT testdb/_doc/3
{"t1":"22","t2":"2020-12-04"
}
PUT testdb/_doc/4
{"t1":"33","t2":"2019-12-04"
}
##### 多条件精确查询
GET testdb/_search
{"query": {"bool": {"should": [ #有{"term": {"t1":"22" }},{"term": {"t1":"33"}}]}}
}
22 33都能被查出来 精确查询t1=22 或 33的文档
高亮查询
########## 高亮显示
GET wang/user/_search
{"query": {"match": {"name": "小王"}},"highlight": {"fields": {"name":{}}}
}
########## 展示部分结果
"hits" : [{"_index" : "wang","_type" : "user","_id" : "1","_score" : 1.8534994,"_source" : {"name" : "小王同学","age" : 23,"desc" : "一顿操作猛如虎,一看工资2500","tags" : ["技术宅","帅气","宅男"]},"highlight" : {"name" : ["<em>小</em><em>王</em>同学" #高亮被em包裹起来]}
我想自己设置高亮怎么做
上述代码改进
###### 自定义高亮条件
GET wang/user/_search
{"query": {"match": {"name": "小王"}},"highlight": {"pre_tags": "<p class='key' style='color:red'>", "post_tags": "</p>", "fields": {"name":{}}}
}
###### 部分结果"_index" : "wang","_type" : "user","_id" : "1","_score" : 1.8534994,"_source" : {"name" : "小王同学","age" : 23,"desc" : "一顿操作猛如虎,一看工资2500","tags" : ["技术宅","帅气","宅男"]},"highlight" : {"name" : ["<p class='key' style='color:red'>小</p><p class='key' style='color:red'>王</p>同学" #已被包裹]}
Spring Boot集成
导入依赖 原生依赖
<dependency><groupId> org.elasticsearch.client </ groupId><artifactId > elasticsearch -rest-high-level-client </ artifactId> <version> 7.6.2 </ version>
</ dependency>
初始化 对象
//第一步 构建一个RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"),new HttpHost("localhost", 9201, "http")));
//单机即new HttpHost一个就行
//用完一定要关闭
client.close();
配置基本项目
一定要保证我们导入的版本和我们的ES版本一致
<properties><java.version>1.8</java.version>
<!-- 自定义版本依赖--><elasticsearch.version>7.6.1</elasticsearch.version></properties>
关于索引的API操作
@SpringBootTest
class WangEsApiApplicationTests {@Autowiredprivate RestHighLevelClient restHighLevelClient;
/// 索引相关操作//测试索引的创建 Request@Testvoid testCreateIndex() throws IOException {//1.创建索引请求CreateIndexRequest request = new CreateIndexRequest("wang_index");//2.执行创建请求CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);//我们的head会出现wang_index索引库}//测试是否存在索引库 只能判断存不存在@Testvoid testExitstIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("wang_index");boolean exists = restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);System.out.println(exists);}//删除索引void testDeleteIndex() throws IOException {DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("wang_index");AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);System.out.println(delete.isAcknowledged());//结果显示true代表成功删除}}
关于文档的操作
//模拟实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {private String name;private int age;
}
/ 测试文档操作@Test//测试添加文档void testAddDocument() throws IOException {//创建对象User user = new User("小王同学",3);//创建请求IndexRequest request = new IndexRequest("wang_index");//指定我们的规则request.id("1");request.timeout(TimeValue.timeValueSeconds(1));request.timeout("1s");//将我们的数据放入请求request.source(JSON.toJSONString(user), XContentType.JSON);//客户端发送请求IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);System.out.println(indexResponse.toString());System.out.println(indexResponse.status());}
//测试文档是否存在@Testvoid testIsExists() throws IOException {GetRequest getRequest = new GetRequest("wang_index","1");//不获取返回的_source的上下文getRequest.fetchSourceContext(new FetchSourceContext(false));boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);System.out.println(exists);// 返回True}@Test//测试获取文档void testGetDocument() throws IOException {GetRequest getRequest = new GetRequest("wang_index", "1");GetResponse documentFields = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);System.out.println(documentFields.getSourceAsString());System.out.println(documentFields);//这里打印的全部内容跟我们的命令是一样的}@Test//测试update文档void update() throws IOException {UpdateRequest request = new UpdateRequest("wang_index", "1");request.timeout("1s");User user = new User("王公子", 18);request.doc(JSON.toJSONString(user),XContentType.JSON);UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);System.out.println(update.status());System.out.println(update.toString());}@Test//测试删除文档void testDelete() throws IOException {DeleteRequest request = new DeleteRequest("wang_index", "1");request.timeout("1s");DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);System.out.println(delete.status());System.out.println(delete.toString());}
测试大批量放入请求
@Test
//批量导入数据
void
testBulkRequest() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("10s");ArrayList<User> users = new ArrayList<>();users.add(new User("wang",12));users.add(new User("王",43));users.add(new User("涛",33));users.add(new User("涛涛",13));users.add(new User("诸葛",53));users.add(new User("猪哥",13));users.add(new User("涛1",43));users.add(new User("小王2",33));users.add(new User("wang1",23));users.add(new User("wang2",33));users.add(new User("wang3",93));for (int i = 0; i <users.size() ; i++) {bulkRequest.add(new IndexRequest("wang_index").id(""+(i+1)) //不写id的话我们会生成随机的id.source(JSON.toJSONString(users.get(i)),XContentType.JSON));}BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);System.out.println(bulk.hasFailures());//测试是否失败
}
@Test//测试查询//SearchRequest 搜索请求//SearchSourceBuilder 搜索条件构造//HighlightBuilder 构建高亮// TermQueryBuilder 精确查询构造//MatchAllQueryBuilder 全部条件构造//xxxxQueryBuilder 对应我们看到的所有命令void testSelect() throws IOException {SearchRequest request = new SearchRequest("wang_index");//构建搜索条件SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//查询条件,我们可以使用QueryBuilders工具类来实现//QueryBuilders.termQuery精确匹配//QueryBuilders.matchAllQuery()查询所有TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name","涛");searchSourceBuilder.query(termQueryBuilder);//设置分页searchSourceBuilder.from(0);searchSourceBuilder.size(3);searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));request.source(searchSourceBuilder);SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);System.out.println(JSON.toJSONString(search.getHits()));//遍历for (SearchHit documentFields : search.getHits().getHits()) {System.out.println(documentFields);}}
//测试高亮在我们的实战中测试
ElasticSearch学习笔记(二)相关推荐
- ElasticSearch学习笔记(二)—结构了解和索引文档增删改
前面学习了ElasticSearch的概况以及一些配套插件的安装.这篇旨在记录对ES结构的了解和一些基本的操作. ElasticSearch结构: 对于ES来说,有几个专有名词.比如索引,类型,id这 ...
- 2018/2/11 ELK技术栈之ElasticSearch学习笔记二
终于有时间记录一下最近学习的知识了,其实除了写下的这些还有很多很多,但懒得一一写下了: ElasticSearch添加修改删除原理: ElasticSearch的倒排索引和文档一旦生成就不允许修改(其 ...
- ElasticSearch学习笔记二 初识Elasticsearch
初识Elasticsearch Elasticsearch简介 Elasticsearch术语及概念 文本(Text) 索引词/精确值(term) 精确值 VS 全文 分析(Analysis)与分析器 ...
- elasticsearch学习笔记——二.querystring查询document方式与dsl查询document方式
// 1.创建test_serach索引,指定主要分片数量,副本分片数量,文档中字段的数据类型,分词器,是否作为搜索条件 PUT test_search { "settings": ...
- ElasticSearch学习笔记之二十一 指标聚合
ElasticSearch学习笔记之二十一 指标聚合 指标聚合 Avg Aggregation Script Value Script Missing value Weighted Avg Aggre ...
- ElasticSearch学习笔记之十一 Anayle API和IK分词器
ElasticSearch学习笔记之十一 Anayle API和IK分词器 Anayle API IK分词器 IK分词器版本支持 安装 下载或者编译 选择一 选择二 重启ElasticSearch I ...
- 码匠社区学习笔记(二)
所需资料 教程视频地址 Bootstrap spring模板 elasticsearch中文社区(想模仿的效果) 码云aAuth 获取授权用户的资料 github第三方授权文档 码匠社区学习笔记(二) ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
最新文章
- 一文理清集成学习知识点(BoostingBagging)
- 【Python学习系列六】Python语言基本语法
- Ubuntu 使用Git 使用
- ASP.NET页面对象模型:Page类介绍
- Java实现心跳机制
- bigdecimal如何做除法_二胎家庭如何平衡两个孩子的关系?聪明的父母都懂这四个法则...
- 2d游戏地图编辑器_从零开始的unity(3)——2d背景的制作和使用
- 因为计算机丢失user32.dll,无法启动程序,说是计算机丢失user32.dll
- PCB板材的分类和介电常数
- 盘点:12个超炫数据可视化工具
- vb/vb.net开发技巧荟萃(九)
- 移动端应该如何动态设置字体大小?
- 基于tkinter+win32+pynput实现python的QQ微信刷屏(比某些文章稍微高级一点)
- 电脑网站如何用支付宝收款(php)
- 小南再谈Vue(QA)
- 注册中心对比Zookeeper、Eureka、Nacos、Consul和Etcd
- 解决java.lang.IllegalArgumentException
- 最近 Github 上爆火的 Chrome 生产力神器 Omni 是什么鬼?
- 使用linux 中的 tree 指定显示深度,显示文件目录结构
- 建筑卫生陶瓷行业中国驰名商标新增10件
热门文章
- java改变this指向_[Java教程]JavaScript中的this指向
- exxi6.7如何传文件到win7_win7系统被删除文件如何恢复 恢复被删除的文件操作方法【详解】...
- Java基础:Lambda表达式
- SQL:postgresql中st_union合并多条geom数据
- java扫码盒_[腾讯 TMQ] JAVA 代码覆盖率工具 JaCoCo-实践篇
- Java基础学习(1)-反射
- 深度学习笔记_基本概念_卷积网络中的通道channel、特征图feature map、过滤器filter和卷积核kernel
- 【一天一个C++小知识】004.C++中内部链接和外部链接
- 《Cascade R-CNN: Delving into High Quality Object Detection》论文解析
- C++类的静态成员函数普通成员函数