Elasticsearch从入门到精通

目录

🧂1.简单介绍

🥓2.安装与下载

🌭3.安装启动es

🍿4.安装启动kibana 

🥞5.初步检索 

🧈6.进阶检索

🫓7.Elasticsearch整合 


1.简单介绍🚗🚗🚗

Elaticsearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎,是整个ElasticStack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。

官方地址:来这哈

2.安装与下载🚗🚗🚗

  • 1.docker pull elasticsearch:7.4.2

在docker中使用命令拉取镜像,安装到docker

  • 2.docker pull kibana:7.4.2

安装es可视化工具

安装需要时间,莫着急哦~ 

3.安装启动es🚗🚗🚗

  •  1.创建挂载目录
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticssearch/data
  • 2.设置允许远程访问 
echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml
  • 3.给文件赋权限 

给elasticsearch下全部文件赋可读可写可执行的权限

chomd -R 777 /mydata/elasticsearch/
  • 4..启动elasticsearch 
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2
  • --name : 容器名字
  • -p: 暴露端口、9200:访问端口,9300:做集群时内部暴露端口
  • -e "discovery.type=single-node" : 单机启动
  • -e ES_JAVA_OPTS="-Xms64m -Xmx128m" : 初始64m,最大128m
  • -v: 将容器中的文件挂在到自己的机器上
  • -d: 启动镜像的名称 

 5.访问

端口

4.安装启动kibana 🚗🚗🚗

  • 1.查看docker对外暴露的ip
docker inspect elasticsearch | grep IPAddress
  • 2.启动kibana 
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://刚刚查出来的docker暴露的ip:9200 -p 5610:5610 -d kibana:7.4.2

ELASTICSEARCH_HOSTS= “不是自己的Linux上的ip地址,而是步骤一查出来docker地址”

  • 3.访问

5.初步检索 🚗🚗🚗

5.1_cat

使用postman发送请求~,使用自己虚拟机的IP地址!!!全部为GET请求

  • 1.查看所有节点信息  /_cat/nodes
http://192.168.20.130:9200/_cat/nodes
  • 2.查看es健康状况  /_cat/health
http://192.168.20.130:9200/_cat/health
  • 3.查看主页节点  /_cat/master
http://192.168.20.130:9200/_cat/master
  • 4.查看所有索引   /_cat/indices
http://192.168.20.130:9200/_cat/indices

5.2索引一个文档(保存)

保存一个数据,保存在哪个索引的那个类型下指定用哪个唯一标识 

  • 1.使用命令保存一条记录(put/post请求、发送json)
http://192.168.20.130:9200/customer/external/1

注:

  • 1.同一个请求,发送多次,就变为修改~
  • 2.POST新增。如果不指定id,会自动生成id。指定id 就会修改这个数据,并新增版本号
  • 3.PUT可以新增可以修改。PUT必须指定id;由于PUT需要指定id,我们一般都用来做修操作,不指定id会报错。

5.3查询文档 

  • 1.发送get请求查询  customer/external/
http://192.168.20.130:9200/customer/external/1

5.4更新一个文档 

发送PSOT请求,指定哪个索引下,哪个类型下,id的是多少

  • 1.post携带update

会对比原来的数据,如果更新前后一致,则不做改变。

http://192.168.20.130:9200/customer/external/1/_update

  • 2.post不携带update 

不会对比原来的数据,直接叠加版本

http://192.168.20.130:9200/customer/external/1

  • 3.put 

和post不懈怠update一样,put可以新增也可以修改,但必须指定id

http://192.168.20.130:9200/customer/external/1

5.5删除

发送delete请求,删除那个索引、那个类型下的id

  • 1.删除某一条数据
http://192.168.20.130:9200/customer/external/1
  • 2.删除整个索引 
http://192.168.20.130:9200/customer

5.6bulk批量api 

  • 1.使用kibana批量发送

  • 2.es测试数据 

测试数据放到资源那里了,自行下载

6.进阶检索🚗🚗🚗

6.1基本检索方式

  •  1.第一种检索:检索条件直接写在路径后面
GET bank/_search?q=*&sort=account_number:asc
  • 2.第二种检索:使用请求体

使用Query DSL,提供一个可执行的Json风格的DSL

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 5,
  "_source": [
    "balance",
    "firstname"
  ]
}

query:代表查询条件 

sort:代表排序条件

from: 从第几条数据开始查

size:每次查出多少条数据

_source:指定命中的字段

 6.2基本语法

  • 1.match【模糊查询】

模糊检索

GET bank/_search
{
  "query": {
    "match": {
      "address": "kings"
    }
  }
}
  • 2.match_phrase【字段查询】

指定上相应的字段和对应的值,进行精确查询

GET bank/_search
{
  "query": {
    "match_phrase": {
      "address": "kings"
    }
  }
}
  • 3.multi_match【多字段查询】

多字段匹配,fileds里的字段,只要有一个匹配query的值即可,而且还是分词查

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["address","city"]
    }
  }
}
  • 4.bool 【复合查询】

 must: 必须匹配

must_not: 不能匹配

should:匹不匹配都可以

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "28"
          }
        }
      ],
      "should": [
        {"match": {
          "lastname": "wallace"
        }}
      ]
    }
  }
}
  • 4.filter【结果过滤】

不计算相关性得分

GET bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 30
          }
        }
      }
    }
  }
}
  • 5.term

term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。

GET bank/_search
{
  "query": {
    "term": {
        "age":28
    }
  }
}
  • 6.aggregations【执行聚合】
  • 聚合提供了从数据中分组和提取数据的能力。
  • 最简单的聚合方法大致等于SQLGROUPBY和SQL聚合函数。
  • 在Elasticsearch中,您有执行搜索返回hits (命中结果) ,并且同时返回聚合结果,把一个响应中的所有hits (命中结果)分隔开的能力。这是非常强大且有效的,您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用一次简洁和简化的API来避免网络往返。
GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageAvg":{
      "avg": {
        "field": "age"
      }
    },
    "balanceAvg":{
      "sum": {
        "field": "balance"
      }
    }
  },
  "size": 0
}

aggs:使用聚合函数,名称要见名知意 

avg:表示平均值

sum:表示求和

查出所有年龄分布,并且这些年龄段中M的平均薪资和F的平均薪资以及这个年龄段总体平均薪资

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },"aggs": {
            "balanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "ageBalance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

子聚合,在一个聚合函数名称下,在使用aggs聚合 

6.3Mapping

  • 1.创建映射

在创建索引时,规定字段的类型

PUT /my_index
{
  "mappings": {
    "properties": {
      "age": {"type": "integer"},
      "email": {"type": "keyword"},
      "name": {"type": "text"}
    }
  }
}
  • 2.添加新的字段映射 
PUT /my_index/_mapping
{
  "properties":{
    "employee-id":{
      "type": "keyword",
      "index": false
    }
  }
}
  • 3.更新映射

对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移

  • 4.数据迁移

先创建出新的正确映射,然后再迁移

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

source:原数据

dest:要迁移的数据

index:要迁移数据的名称

type:迁移数据的类型

6.4分词

  • 一个tokenizer (分词器)接收一个字符流,将之分割为独立的tokens (词元,通常是独立的单词),然后输出 tokens 流。
  • 例如, whitespace tokenizer 遇到空白字符时分割文本。它会将文本"Quick brown fox!" 分割为[Ouick, brown, fox]
  • 1.安装ik分词器

官网:ik分词器

解压到elasticsearch的plugins下~ ,记得重启elasticsearch!!

  • 2.测试分词效果 

  • 3.自定义分词 

3.1使用nginx配置分词,再nginx的html下创建文件夹es,并配置location

 3.2配置分词器地址

在ik分词器的配置文件中,添加分词器地址

重启elastic search~ 

7.Elasticsearch整合 🚗🚗🚗

7.1创建服务

在父工程下创建新模块作为检索服务,并导入依赖

       <!--导入es的rest-high-level-client-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
        </dependency>

但是如果<elasticsearch.version>7.4.2</elasticsearch.version>不生效,jar包冲突,版本不匹配,将版本不匹配的移除,重新引入!!! 

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.4.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.2</version>
        </dependency>

7.2写配置

编写配置类,被容器中注入RestHighLevelClient,并写入预检请求

@Configuration
public class ElasticSearchConfig {

    public static final RequestOptions COMMON_OPTIONS;

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

    @Bean
    public RestHighLevelClient esRestClient() {

        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.20.130", 9200, "http")
                )
        );
        return client;
    }
}

7.3测试

  • 1.测试保存请求,也可修改
@Test
    public void indexData() throws IOException {
        IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1");
        //推荐方式,将对象转换为json
        User user = new User();
        user.setUserName("会敲代码的小张");
        user.setAge(18);
        user.setGender("男");
        String jsonString = JSON.toJSONString(user);
        indexRequest.source(jsonString, XContentType.JSON);
        //执行保存
        IndexResponse index = restHighLevelClient.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);

        //提取有用的数据
        System.out.println(index);

    }
    @Data
    class User{
        private String userName;
        private String gender;
        private Integer age;
    }
  • 2.复查检索
@Test
    public void select() throws IOException {
        //1.创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //2.指定索引
        searchRequest.indices("bank");
        //3.指定DSL检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //3.1构造query条件
        sourceBuilder.query(QueryBuilders.matchQuery("address", "mill"));
        //3.2构造聚合条件
        //3.2.1-按照你啊年龄聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);
        //3.2.2-计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);

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

        searchRequest.source(sourceBuilder);

        //4.执行检索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);

        //5.分析结果
        System.out.println("查询结果" + searchResponse.toString());
        //5.1获取查到的所有数据
        SearchHits hits = searchResponse.getHits();

        //5.2查询真正的命中记录
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            String sourceAsString = hit.getSourceAsString();
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println("值:" + account);
        }
        //5.3获取分析信息
        Aggregations aggregations = searchResponse.getAggregations();
        Terms ageAgg1 = aggregations.get("ageAgg");
        for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
            String keyAsString = bucket.getKeyAsString();
            System.out.println("年龄:"+keyAsString+"===>"+bucket.getDocCount());
        }
        Avg balanceAvg1 = aggregations.get("balanceAvg");
        System.out.println("平均薪资:"+balanceAvg1.getValue());


    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/392550.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用一根网线,让Ubuntu和正点原子I.MX6ULL开发板互相ping通

1.硬件准备 准备一根网线即可 2. 让windows和I.MX6ULLping通 2.1 找根网线将I.MX6ULL和电脑连起来 2.2 让I.MX6ULL通电运行起来&#xff0c;我这里使用的是正点原子版本的内核、 2.3 进入电脑的网络连接后&#xff0c;按照如下步骤操作 2.4 将ip地址、子网掩码、默认网关…

数据结构-双指针法

介绍 双指针法是一种可以在O&#xff08;n&#xff09;时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表&#xff0c;从而实现特定操作。 常见的双指针法有 1.快慢指针&#xff1a;快指针每次移动两步&…

阿里云服务器配置怎么选?CPU内存带宽配置多大?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题

在 webpack 的配置文件 webpack.config.js 中有一个配置项 devServer 里面有一个属性是 proxy&#xff0c;这里面可以配置代理服务器&#xff0c;解决跨域问题&#xff0c;请参考官网。 一般来说 webpack 的代理就是说的开发服务器 webpack-dev-server。 其实不光是 webpack 其…

“挖矿”系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖“金矿”&#xff01; 1. Python、conda 和 pip&#xff08;挖“金矿”工具&#xff09; Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&…

AIGC实战——能量模型(Energy-Based Model)

AIGC实战——能量模型 0. 前言1. 能量模型1.1 模型原理1.2 MNIST 数据集1.3 能量函数 2. 使用 Langevin 动力学进行采样2.1 随机梯度 Langevin 动力学2.2 实现 Langevin 采样函数 3. 利用对比散度训练小结系列链接 0. 前言 能量模型 (Energy-based Model, EBM) 是一类常见的生…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术&#xff08;5&#xff09; 13.2 ATS&#xff08;Address Translation Services&#xff09; 单纯使用IOMMU并不能充分发挥处理器系统的效率&#xff0c;从图13-2中可以发现&…

JVM-JVM中对象的生命周期

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 对象的创建 常量池检查:检查new指令是否能在常量池…

亚马逊测评:揭秘做号的“花招”与“猫腻”,如何避免被割韭菜?

亚马逊测评行业如今如火如荼&#xff0c;吸引了众多朋友投身其中。然而&#xff0c;这个行业也是五花八门&#xff0c;什么样的人和公司都有&#xff0c;让人眼花缭乱。作为卖家&#xff0c;如何选择靠谱的测评服务商是一门必修课&#xff1b;而对于初学者&#xff0c;如何入门…

TensorRT转换onnx的Transpose算子遇到的奇怪问题

近来把一个模型导出为onnx并用onnx simplifier化简后转换为TensorRT engine遇到非常奇怪的问题&#xff0c;在我们的网络中有多个检测头时&#xff0c;转换出来的engine的推理效果是正常的&#xff0c;当网络中只有一个检测头时&#xff0c;转换出来的engine的推理效果奇差&…

PAM | 账户安全 | 管理

PAM PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插入式身份验证模块&#xff09;是一个灵活的身份验证系统&#xff0c;允许我们通过配置和组合各种模块来实现不同的身份验证策略。 在 Linux 或类 Unix 系统中&#xff0c;常见的 PAM 模块包括以下几种类…

时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测

时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测 目录 时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间…

Open CASCADE学习|直纹曲面(ruled surface)

直纹曲面是一类特殊的曲面&#xff0c;在几何学和微分几何中都有研究。它的主要特性是&#xff0c;曲面上的每一点都有至少一条直线经过。换句话说&#xff0c;直纹曲面可以由一条直线通过连续运动构成。在三维欧几里德空间中&#xff0c;最常见的直纹曲面是平面、柱面和锥面&a…

JAVA面试框架篇

1. Spring refresh 流程 要求 掌握 refresh 的 12 个步骤 Spring refresh 概述 refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#x…

Manifest merger failed with multiple errors, see logs

问题 Manifest merger failed with multiple errors, see logs详细问题 笔者进行Android 项目开发&#xff0c;修改AndroidManifest.xml代码后&#xff0c;控制台报错 AndroidManifest.xml报错核心代码 <manifest><uses-permission android:name"android.perm…

解码DMAIC:李国武老师的品质与运营之道

DMAIC&#xff0c;对于许多人来说可能还是一个相对陌生的概念。但如果你是企业界的观察者&#xff0c;或者对提升产品质量有着浓厚的兴趣&#xff0c;那么你一定不能错过这个话题。DMAIC不仅是一种方法论&#xff0c;更是企业实现卓越运营、提升竞争力的关键工具。今天&#xf…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享&#xff0c;乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式&#xff0c;可以按单价&#xff0c;也可以按时间段 可…

166基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪

基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪&#xff0c;分辨虚假imf&#xff0c;提取最大峭度imf图。输出去噪前后时域及其包络谱结果。程序已调通&#xff0c;可直接运行。 166 matlab SVD去噪 IMF筛选 包络谱 (xiaohongshu.com)

2.14日学习打卡----初学Zookeeper(一)

2.14日学习打卡 目录: 2.14日学习打卡Zookeeper概念一. 集中式到分布式单机架构集群架构什么是分布式三者区别 二. CAP定理分区容错性一致性可用性一致性和可用性的矛盾一致性和可用性如何选择 三. 什么是Zookeeper分布式架构Zookeeper从何而来Zookeeper介绍 四. 应用场景数据发…