ElasticSerach的学习(高级篇)

这篇博客介绍了Elasticsearch的高级使用,包括通过Docker在Linux上安装ES和Kibana,使用Postman进行API测试,安装IK分词器并自定义词库,理解倒排索引原理,以及如何将ES整合到Springboot应用中进行复杂检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES简介

参考笔记
我自己的笔记
在这里插入图片描述
在这里插入图片描述

ES安装和Kilbana可视化安装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

docker–es挂载linux

#查看防火墙开启的端口号
firewall-cmd --state //查看运行状态
firewall-cmd --list-all
// 开放1024的端口
firewall-cmd --add-port=1024/tcp --permanent
// 重载生效刚才的端口设置
firewall-cmd --reload

#进入运行的服务容器的内部
docker exec -it mysql /bin/bash

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

开启9200和9300的防火墙端口+阿里云的安全组
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v  /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2

在这里插入图片描述

在这里插入图片描述

继续检查权限问题

在这里插入图片描述

在这里插入图片描述

postman测试ES

在这里插入图片描述
在这里插入图片描述

docker–kibana配置

在这里插入图片描述
在这里插入图片描述

# kibana指定了了ES交互端口9200  # 5601位的kibana主页端口
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://118.31.113.58:9200 -p 5601:5601 -d kibana:7.4.2

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

重启docker+重启容器(name)

f2c1f16e7ba3   kibana:7.4.2          "/usr/local/bin/dumb…"   3 hours ago   Exited (255) About a minute ago   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana

745ae8b1bd1e   elasticsearch:7.4.2   "/usr/local/bin/dock…"   3 hours ago   Exited (255) About a minute ago   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch

a370cd04c1f3   redis                 "docker-entrypoint.s…"   9 days ago    Exited (255) About a minute ago   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                              redis

0473697f79a4   mysql:5.7             "docker-entrypoint.s…"   9 days ago    Exited (255) About a minute ago   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                   mysql

服务器重启后:docker启动+重启容器(docker restart 容器name)

在这里插入图片描述

ES入门

参考学习

基础的增删改查(postman测试)

在这里插入图片描述
在这里插入图片描述

get查询和seq_no的乐观锁状态(用于高并发的问题CAS)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

bulk 批量 API(kibana测试)

在这里插入图片描述

两条数据是独立的统计的
在这里插入图片描述
在这里插入图片描述
测试数据链接

在这里插入图片描述
在这里插入图片描述

ES进阶

search API

在这里插入图片描述

Query字段:

在这里插入图片描述

source字段:
在这里插入图片描述

match匹配查询:(会进行分词查询)
在这里插入图片描述
在这里插入图片描述

bool复合查询(嵌套查询)
在这里插入图片描述
在这里插入图片描述

should字段,影响查询的得分情况(能够看到相关度越高,得分也越高。)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

filter结果过滤:(区间检索)

在这里插入图片描述
在这里插入图片描述

term字段的使用:
在这里插入图片描述

全文检索字段用match,其他非text字段匹配用term
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Mapping映射

在这里插入图片描述

创建索引并指定映射:(这个type字段已经过时了)

PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "keyword" # 指定为keyword
      },
      "name": {
        "type": "text" # 全文检索。保存时候分词,检索时候进行分词匹配
      }
    }
  }
}

在这里插入图片描述

对已创建的索引添加新的字段映射(指定不能检索):
在这里插入图片描述

在这里插入图片描述

==修改映射 && 数据迁移 ==
在这里插入图片描述

希望修改原来的age字段从long修改为integer,只能先创建新的索引,再使用数据迁移
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

POST _reindex
{
  "source": {
    "index": "bank",
    "type": "account"
  },
  "dest": {
    "index": "newbank"
  }
}

在这里插入图片描述
在这里插入图片描述

分词器

在这里插入图片描述

ES内置的标准分词器:
在这里插入图片描述

在这里插入图片描述

安装ik分词器

github地址
直接将ik分词器的压缩包放到es的plugins的目录下(我们做好了docker容器和linux的映射的文件关系)

在这里插入图片描述
在这里插入图片描述

unzip elasticsearch-analysis-ik-7.4.2.zip -d ik
rm -rf elasticsearch-analysis-ik-7.4.2.zip

在这里插入图片描述

别忘了重启es的容器:
在这里插入图片描述

在这里插入图片描述

测试ik分词器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

自定义扩展词库

linux相关的docker安装nginx 1.10
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

默认访问html目录下的文件
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

nginx存放的新的分词存放入ik分词器的配置文件
在这里插入图片描述

重启es

在这里插入图片描述
检测测试自定义的分词效果就不检测了,linux带不动了

原理学习

倒排索引

在这里插入图片描述

es的数据类型区分:text和keyword

在这里插入图片描述

ES整合Springboot

Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单(相当于是个和springboot准备好的API调用)

相关的准备工作

指定es的版本,防止导入低阶的Springboot的自带es的低阶版本
在这里插入图片描述

在这里插入图片描述

渐渐有感觉了,排除了相关数据源的注入(或者直接在common依赖排除相关的jar包)
在这里插入图片描述

RestHighLevelClient的配置工作(这个client用来创建索引,保存索引,进行复杂的检索等功能)

@Configuration
public class GulimallEsConfig {

    @Value("${ipAddr}")
    private String host;

    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    /**
     * final String hostname, final int port, final String scheme
     */
    @Bean
    public RestHighLevelClient esRestClient() {

        RestClientBuilder builder = null;
        // 可以指定多个es
        builder = RestClient.builder(new HttpHost(host, 9200, "http"));

        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;
    }
}

整合的测试工作

官方的学习文档

索引的创建和保存

    @Test
    public void indexData() throws IOException {

        // 设置索引
        IndexRequest indexRequest = new IndexRequest("user");
        indexRequest.id("1");

        User user = new User();
        user.setUserName("张三");
        user.setAge(20);
        user.setGender("男");
        String jsonString = JSON.toJSONString(user);//将封装的对象转换为json对象

        //设置要保存的内容,指定数据和类型(source)
        indexRequest.source(jsonString, XContentType.JSON);

        //执行创建索引和保存数据(index)
        IndexResponse index = client.index(indexRequest, GulimallEsConfig.COMMON_OPTIONS);
        
        System.out.println(index);

    }

在这里插入图片描述

复杂的检索功能

聚合函数的检索条件,或许生成的json字符串对象

    @Test
    public void find() throws IOException {
        // 1 创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("bank");

        // 构造检索条件:query,from ,size,aggregation等等
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));

        //AggregationBuilders工具类构建AggregationBuilder
        // 构建第一个聚合条件:按照年龄的值分布进行聚合
        TermsAggregationBuilder agg1 = AggregationBuilders.terms("agg1").field("age").size(10);// 聚合名称
        sourceBuilder.aggregation(agg1);

        // 构建第二个聚合条件:平均薪资
        AvgAggregationBuilder agg2 = AggregationBuilders.avg("agg2").field("balance");
        sourceBuilder.aggregation(agg2);

        System.out.println("检索条件"+sourceBuilder.toString());

        searchRequest.source(sourceBuilder);//真正的检索复杂条件

        // 2 执行--检索
        SearchResponse response = client.search(searchRequest, GulimallEsConfig.COMMON_OPTIONS);
        // 3 分析响应结果
        System.out.println(response.toString());
    }

检索的json字符串,重新封装为javabean对象
在这里插入图片描述

        // 将获取到的相应结果重新进行封装
         JSON.parseObject(response.toString(), Map.class);
        // 3.1 获取java bean
        SearchHits hits = response.getHits();
        SearchHit[] hits1 = hits.getHits();
        for (SearchHit hit : hits1) {
            hit.getId();
            hit.getIndex();
            String sourceAsString = hit.getSourceAsString();//相当于是获取元数据
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println(account);
        }

在这里插入图片描述

获取检索到的聚合函数的分析信息(注意不同的聚合函数,返回的解析对象是不同的:Terms和avg)

        // 3.2 获取检索到的分析信息
        Aggregations aggregations = response.getAggregations();
        Terms aggtest1 = aggregations.get("agg1");
        for (Terms.Bucket bucket : aggtest1.getBuckets()) {
            String keyAsString = bucket.getKeyAsString();
            System.out.println(keyAsString);
        }
        Avg aggtest2 = aggregations.get("agg2");
        System.out.println(aggtest2.getValue());

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值