elk(elasticsearch、logstash、kibana)之elasticsearch

学习文档地址:链接: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分词器即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值