学习文档地址:链接:https://pan.baidu.com/s/10XaK3KImGWEX8vSx_vm2Aw
提取码:3452
git地址:
这里是引用
一、elasticsearch入门
集群间的端口号是9300;
页面上的端口号是9200
二、elasticsearch基本操作
1、elasticsearch与mysql的区别
注意:elasticsearch7后面的已经没有type的概念,默认一个index下面一个type.
2、elasticsearch的查询原理:倒排索引(*********)
一般mysql查询的时候,先查询 索引再查询这一行数据。
但是到了elasticsearch之后,跟mysql反过来,先查询关键字,定位到索引,再查询一行数据
3、创建索引
注意:put请求
{ “acknowledged”【响应结果】: true, #true操作成功
“shards_acknowledged”【分片结果】: true, # 分片操作成功
“index”【索引名称】: “shopping”
}
注意:创建索引库的分片数默认1片,在7.0.0之前的Elasticsearch版本中,默认5片
4、查看所有索引
表头及其含义:
5、查看索引的具体信息
返回数据的具体含义:
6、删除索引
将上面查询/查看索引的方法的请求方式,改成delete就可以了
7、插入文档(不给id,使用es自动生成的id)
返回数据详细描述:
8、插入文档(给id)
9、查询文档
返回值的解释:
10、修改文档
将插入文档的请求方式改成post,然后body里面的数据改变就行
11、修改字段 修改数据时,也可以只修改某一给条数据的局部信息
12、删除文档
http://127.0.0.1:9200/shopping/_doc/1 将会删除id为1的数据
再一次的删除不存在的文档,则会增加版本,result返回错误信息
13、条件删除文档
总结: 一个index强制的话只能有一个type(es7之后这个type可能没有,可能有)
14、设置mapping—es数据结构(mapping相当于mysql中的表结构)
15、maping中的type类型
注意:如果没有索引,则不能用来搜索
16、match查询文档(有条件 )
注意:
查询的条件:我是祖国,查询的时候会将我是祖国分成 我是 + 祖国
17、match查询所有文档(无条件)
返回数据解释:
18、multi_match多条件匹配(注意:多个条件对应的字段都要有索引)
19、term关键字精确查询(字段类型为keyword)
20、把需要查看的字段显示出来(includes、excludes)
总结:查询条件肯定要有,相当于mysql中where后面的查询语句;include相当于select后面查询的字段
21、组合查询(must(=)、must_not(!=) 、 should(or或者什么都没有都可以))
*** 注意:当should跟must/filter(其他条件查询)进行联合使用的时候,那么should就会失效
22、范围查询(range)
23、模糊查询(可以通过查询语句,自动转成其他的查询语句)
24、单字段排序(sort)
25、多字段查询(多个sort)
26、高亮查询(highlight)
27、分页查询(from、size)
28、聚合查询(未记录)
三、java操作es(elasticsearch-rest-high-level-client)
1、索引(index)的增/删/查
// 创建客户端对象
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 创建一个索引
// CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
// CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// System.out.println("响应状态:" + createIndexResponse.isAcknowledged());
// 查看索引
// GetIndexRequest getIndexRequest = new GetIndexRequest("user");
// GetIndexResponse getIndexResponse = client.indices().get(getIndexRequest, RequestOptions.DEFAULT);
// System.out.println("查看的索引结构为:" + getIndexResponse.toString());
// 删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("user2");
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println("删除索引是否成功:" + delete.isAcknowledged());
// 关闭客户端连接
client.close();
2、文档(document)的增/删/改/查(根据id)/批量增/批量删
// *** 1、文档添加
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// // 新增文档-请求对象
// IndexRequest request = new IndexRequest();
// // 设置索引及唯一性标识
// request.index("user").id("1001");
// // 创建数据对象
// User user = new User();
// user.setName("zhangsan");
// user.setAge(30);
// user.setSex("男");
// request.source(JSONUtil.parseObj(user));
// IndexResponse index = client.index(request, RequestOptions.DEFAULT);
// System.out.println("添加文档:" + JSONUtil.toJsonStr(index));
// 关闭客户端连接
// client.close();
// *** 2、文档修改 局部更新
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// UpdateRequest updateRequest = new UpdateRequest();
// updateRequest.index("user").id("1001");
// User user = new User();
// user.setName("bear更新测试");
// updateRequest.doc(JSONUtil.parseObj(user));
// UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
// System.out.println("更新文档:" + JSONUtil.toJsonStr(update));
// 关闭客户端连接
// client.close();
// *** 3、查询文档 根据id
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// GetRequest getRequest = new GetRequest();
// getRequest.index("user").id("1001");
// GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
// System.out.println("查询文档:" + JSONUtil.toJsonStr(documentFields));
// client.close();
// *** 4、删除文档 根据id
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// DeleteRequest deleteRequest = new DeleteRequest();
// deleteRequest.index("user").id("1001");
// DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
// System.out.println("删除文档:" + JSONUtil.toJsonStr(delete.status()));
// client.close();
// *** 5、批量文档操作
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// BulkRequest bulkRequest = new BulkRequest();
// User user = new User();
// user.setName("北极熊测试1");
// user.setAge(12);
// user.setSex("男");
// // 添加的第一个
// IndexRequest request = new IndexRequest().index("user").id("1001").source(JSONUtil.parseObj(user));
// bulkRequest.add(request);
// // 添加的第二个
// IndexRequest request2 = new IndexRequest().index("user").id("1002").source(JSONUtil.parseObj(user));
// bulkRequest.add(request2);
// // 添加的第三个
// IndexRequest request3 = new IndexRequest().index("user").id("1003").source(JSONUtil.parseObj(user));
// bulkRequest.add(request3);
// BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
// System.out.println("批量增加:" + JSONUtil.toJsonStr(bulk));
// client.close();
// *** 6、批量删除
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.add(new DeleteRequest().index("user").id("1001"));
bulkRequest.add(new DeleteRequest().index("user").id("1002"));
// -------------------批量增加/删除/更改都是用的这个方法
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println("批量删除:" + JSONUtil.toJsonStr(bulk));
client.close();
3、高级查询(index、doucment)
3.1 高级查询:查询所有索引数据
// *** 高级查询:查询所有索引数据
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// SearchRequest request = new SearchRequest();
// // 添加索引
// request.indices("student");
// // 高级查询的操作
// SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// // 查询所有数据
// sourceBuilder.query(QueryBuilders.matchAllQuery());
// request.source(sourceBuilder);
// SearchResponse search = client.search(request, RequestOptions.DEFAULT);
// System.out.println("高级查询:" + JSONUtil.toJsonStr(search));
// //{"shardFailures":[],"successfulShards":1,"totalShards":1,"internalResponse":{"numReducePhases":1},"skippedShards":0,"clusters":{"skipped":0,"total":0,"successful":0}}
// // 包含文档信息s
// SearchHits hits = search.getHits();
// for (SearchHit hit : hits) {
// //输出每条查询的结果信息
// System.out.println(hit.getSourceAsString());
// }
3.2 term 精准查询
// RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// SearchRequest request = new SearchRequest();
// // 添加索引
// request.indices("student");
// // 高级查询的操作
// SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// // 查询所有数据
// sourceBuilder.query(QueryBuilders.termQuery("name", "jarry")); // 字段没有索引则不能查询
// request.source(sourceBuilder);
// SearchResponse search = client.search(request, RequestOptions.DEFAULT);
// System.out.println("高级查询:" + JSONUtil.toJsonStr(search));
// //{"shardFailures":[],"successfulShards":1,"totalShards":1,"internalResponse":{"numReducePhases":1},"skippedShards":0,"clusters":{"skipped":0,"total":0,"successful":0}}
// // 包含文档信息
// SearchHits hits = search.getHits();
// for (SearchHit hit : hits) {
// //输出每条查询的结果信息
// System.out.println(hit.getSourceAsString());
// }
3.3 *** 特定字段查询+ bool操作(must =、mustNot !=、should or)+ range范围查询+ 模糊查询 + 高亮显示 + + 聚合 + 分组 + 排序+分页查询 :查询所有再分页查询
// ****** 特定字段查询+ bool操作(must =、mustNot !=、should or)+ range范围查询+ 模糊查询 + 高亮显示 + + 聚合 + 分组 + 排序+分页查询 :查询所有再分页查询
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
SearchRequest request = new SearchRequest();
//*** 添加索引
request.indices("student3");
//*** 高级查询的操作
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//*** 查询所有数据 (无条件)
sourceBuilder.query(QueryBuilders.matchAllQuery());
// *** bool操作(有条件)(must,mustNot,should)
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//*** 范围查询
// RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");
// rangeQuery.gte(13);
// rangeQuery.lte(40);
// sourceBuilder.query(rangeQuery);
//*** must 肯定包含 =
// boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
// sourceBuilder.query(boolQueryBuilder);
// *** mustNot 不包含 !=
// boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "女的"));
// sourceBuilder.query(boolQueryBuilder);
// *** should 可能包含 or 或者什么都没有(当有must或者filter条件查询的时候,这里就是什么都没有的意思;案例;因为上面存在range,所以这里不生效)
// boolQueryBuilder.should(QueryBuilders.matchQuery("age", 12));
// boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
// sourceBuilder.query(boolQueryBuilder);
//*** 模糊查询 (分词查询)
// sourceBuilder.query(QueryBuilders.fuzzyQuery("name","海飞").fuzziness(Fuzziness.ONE));
//*** 高亮查询 将查询出来的数据高亮显示
//构建高亮字段
// HighlightBuilder highlightBuilder = new HighlightBuilder();
// highlightBuilder.preTags("<font color='red'>");//设置标签前缀
// highlightBuilder.postTags("</font>");//设置标签后缀
// highlightBuilder.field("name");//设置高亮字段
// //设置高亮构建对象
// sourceBuilder.highlighter(highlightBuilder);
//*** 聚合查询
// sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));
//*** 分组统计
sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
//*** 包含和不包含
// String[] excludes = {};
// String[] includes = {"name", "age"};
// sourceBuilder.fetchSource(includes, excludes); // 查询出特定的字段
// sourceBuilder.sort("age", SortOrder.DESC); // 排序
//*** 分页查询
// sourceBuilder.from(0); // 开始页数,从0开始
// sourceBuilder.size(2); // 每页数量
request.source(sourceBuilder);
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
System.out.println("高级查询:" + JSONUtil.toJsonStr(search));
//{"shardFailures":[],"successfulShards":1,"totalShards":1,"internalResponse":{"numReducePhases":1},"skippedShards":0,"clusters":{"skipped":0,"total":0,"successful":0}}
// 包含文档信息
SearchHits hits = search.getHits();
for (SearchHit hit : hits) {
//输出每条查询的结果信息
System.out.println(hit.getSourceAsString());
// 打印高亮结果
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
System.out.println(highlightFields);
}
System.out.println("<<::::");
client.close();
四、搭建es集群(windows)
复制es三份,每一份是一个node(节点),修改他们的config/elasticsearch.yml文件
第一个节点node1节点:
第二个节点:
第三个节点:
配置完成之后,启动3个节点服务器,就可以发现他们的数据时可以共享的
开始es高级应用
五、分片(为啥需要分片)、副本介绍
为啥需要分片:
- 允许你水平分割/扩展你的内容容量。
- 允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
副本:
- 防止节点失败(副本和复制它的分片不在同一个节点上)
- 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
六、分词器
1、加入ik分词器,注意点1:要跟es的版本保持一致2:将ik分词器放在一个文件夹中,再将文件夹放入es的plugs中
2、ik_max_word和ik_smart显示效果
注意:
- ik_max_word:会将文本做最细粒度的拆分
- ik_smart:会将文本做最粗粒度的拆分
3、ik中加入额外的dic文件(控制分词)
4、设置索引中类型为text的分词器为ik:
注意:查询的时候也使用ik分词器即可