ES基础入门

news2025/1/19 20:30:32

ES

一、简介

1、Elastic Stack

ES技术栈:

  • ElasticSearch:存数据+搜索;QL;
  • Kibana:Web可视化平台,分析。
  • LogStash:日志收集,Log4j:产生日志;log.info(xxx)
  • 。。。。

image-20220930095909877

使用场景:

  • metrics:指标监控

2、基本概念

  • Index(索引)

    • 动词:保存(插入)
    • 名词:类似MySQL数据库,给数据
  • Type(类型)

    • 已废弃,以前类似MySQL的表
    • 现在用索引对数据分类
  • Document(文档)

    • 真正要保存的一个JSON数据

    • {
          name:"tcx"
      }
      

二、入门实战

{
  "name" : "DESKTOP-1TSVGKG",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "PFpgHGhaTZiajHD4xvRPkg",
  "version" : {
    "number" : "7.14.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "dd5a0a2acaa2045ff9624f3729fc8a6f40835aa1",
    "build_date" : "2021-07-29T20:49:32.864135063Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

1、索引CRUD

1.创建索引

put http://localhost:9200/person

{
    "acknowledged": true, #响应结果
    "shards_acknowledged": true,  #分片
    "index": "person"   #索引名称
}

2.删除索引

delete http://localhost:9200/person

{
    "acknowledged": true
}

3.修改索引

# 在修改时,需要先删掉索引
put http://localhost:9200/person

{
    "settings": {
        "index": {
            "number_of_shards":"3"
        }
    }
}

4.查询索引

get http://localhost:9200/person

{
    "person": {
        "aliases": {},
        "mappings": {},
        "settings": {
            "index": {
                "routing": {
                    "allocation": {
                        "include": {
                            "_tier_preference": "data_content"
                        }
                    }
                },
                "number_of_shards": "3",
                "provided_name": "person",
                "creation_date": "1664357188860",
                "number_of_replicas": "1",
                "uuid": "GOyDifOJTQi8yBzKHk5zNQ",
                "version": {
                    "created": "7140099"
                }
            }
        }
    }
}

2、文档CRUD

1、保存-POST(非幂等性)

POST /person/_doc
{
  "id":"1",
  "name":"田",
  "age":"19"
}

# 结果
{
  "_index" : "person", //保存到的索引
  "_type" : "_doc", //
  "_id" : "BcKKg4MBcNCrjSmlWbAK",  //刚才那条数据的唯一id
  "_version" : 1,  //版本号
  "result" : "created", //创建了数据
  "_shards" : {  //分片工作
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,  //乐观锁机制
  "_primary_term" : 1  //乐观锁机制
}

以上是:非幂等操作

  • 幂等:同一个操作执行无数遍的结果都是一样的
    • select
    • insert: 幂等
  • 非幂等:
    • insert: 自增主键就是非幂等

2、保存-PUT(幂等性)

保存更新 二合一

PUT /person/_doc/1
{
  "id":"1",
  "name":"田",
  "age":"19"
}


PUT /person/_doc/1
{
  "id":"1",
  "name":"田",
  "age":"19",
  "note":"做个小笔记"
}

# 也可以任意扩展/缩减字段;(会覆盖)

3、POST-增量字段更新

POST person/_doc/1/_update
{
  "doc":{
    "name":"张三"
  }
}

4、查询

# 查看所有
GET /person/_search

# 根据ID查询
GET /person/_doc/ID

5、乐观锁

CAS

三、进阶检索

#  DSL 查询条件以Json
POST person/_search
{
  "query": {
    "match_all": {}
  }
}

1、导入基本数据


POST /student/_doc/1001
{
  "name":"李白",
  "age":"18"
}

POST /student/_doc/1002
{
  "name":"诗仙",
  "age":"19"
}

POST /student/_doc/1003
{
  "name":"杜甫",
  "age":"20"
}



POST /student/_doc/1004
{
  "name":"诗圣",
  "age":"21"
}

POST /student/_doc/1005
{
  "name":"诗圣 厉害",
  "age":"21"
}

2、查询所有文档

POST /student/_search
{
  "query": {
    "match_all": {}
  }  
}


POST /student/_search
{
  "query": {
    "match_all": {}
  }  
}


{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1001",
        "_score" : 1.0,
        "_source" : {
          "name" : "李白",
          "age" : "18"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1002",
        "_score" : 1.0,
        "_source" : {
          "name" : "诗仙",
          "age" : "19"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1003",
        "_score" : 1.0,
        "_source" : {
          "name" : "杜甫",
          "age" : "20"
        }
      },
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1004",
        "_score" : 1.0,
        "_source" : {
          "name" : "诗圣",
          "age" : "21"
        }
      }
    ]
  }
}

3、match-全文索引精确查询

POST /student/_search
{
  "query": {
    "match": {
      "name.keyword": "诗圣"
    }
  }
}

multi_match-多个字段查询

POST /student/_search
{
  "query": {
    "multi_match": {
      "query": "诗圣",
      "fields": ["name"]
    }
  }
}

4、term-精确查询

POST /student/_search
{
  "query": {
    "term": {
      "name": {
        "value": "shixian"
      }
    }
  }
}

5、terms-查询

# 查询age是2018POST /student/_search
{
  "query": {
    "terms": {
      "age": [
        "20",
        "18"
      ]
    }
  }
}

6、多个字段查询

7、查询部分字段

POST /student/_search
{
  "query": {
    "match": {
      "name": "诗圣"
    }
  },
  "_source": ["name"]  
}

8、区间查询

POST /student/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 18,
        "lte": 20
      }
    }
  }
}

9、复合查询

# must 

POST /student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 18,
              "lte": 20
            }
          }
        },{
          "match": {
            "name": "诗圣"
          }
        }
      ]
    }
  }
}

must和filter执行的结果是一样的,但是must会有分数,filter没有分数

10、过滤查询


POST /student/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 18,
              "lte": 20
            }
          }
        },{
          "match": {
            "name": "诗圣"
          }
        }
      ]
    }
  }
}

  • 模糊匹配用match
  • 精确查询用term
  • 多条件组合是bool
  • must,filter相配合
  • should非强制要求

11、判断文档是否存在

#判断文档是否存在
HEAD /student/_doc/1001

12、exists查询


POST /student/_search
{
  "query": {
    "exists": {
      "field": "hello"
    }
  }
}

# 找到有hello属性的文档
{
  "took" : 739,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "student",
        "_type" : "_doc",
        "_id" : "1006",
        "_score" : 1.0,
        "_source" : {
          "name" : "白居易",
          "hello" : "word"
        }
      }
    ]
  }
}

13、批量


#批量查询ID

POST student/_doc/_mget
{
  "ids":["1001","1002"]
}


image-20221008112207118

image-20221008112346329

四、其他功能

1、排序

POST student/_search
{
  "query": {
    "match_all": {
      
    }
  },
  "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}

2、高亮

#高亮
GET student/_search
{
  "query": {
    "match": {
      "age": "21"
    }
  },
 "highlight": {
    "fields": {
      "age": {
        "pre_tags": "<span style='color:res'>",
        "post_tags": "</span>"
      }
    }
  }
}

3、_source-部分字段

POST /student/_search
{
  "query": {
    "match": {
      "name": "诗圣"
    }
  },
  "_source": ["name"]  
}

4、分页

#分页

POST student/_search
{
  "query": {
    "match_all": {
    
    }
  },
  "from": 0,
  "size": 2
}

聚合

image-20221008115217531

五、映射与分词

1、Mapping

  • ES里面保存是JSON
  • 第一次保存了以后,每个索引的数据模型就确定好了,es在第一次保存一个json文档的时候就自动确定了。
  • 在自动确定阶段,所有文本数据都会被确定为text,默认就可以全文检索,这个文本值在存储的时候分词,利用倒排索引存储
  • Mappings第一次已经确定好的属性就不能修改了但是未知的属性随便添加

自定义的数据类型(text,keyword),一定告诉es,这个属性的精确类型

2、分词

  • 分词发生在text字段
  • 保存text类型的数据
    • 把这个值先分词(英文:空格为分割 中文:词库 比较麻烦)
    • 存储利用倒排索引,会记录这些单词都在哪些文档出现
  • 检索
    • 搜索“我是中国人”
    • 把要搜索的”我是中国人“分词(利用词库对比)
      • 中国人: 看那些文档里有
      • 中国 看那些文档里有
      • 我 看那些文档里有
      • 是 看那些文档里有
GET /_analyze
{
  "analyzer": "standard",
  "text":"Offer收割机"
}

必须使用中文分词器

ik分词器

2.1安装ik分词器

下载当前对应版本;

没下载到对应版本的话,可以在ik分词器解压后,在plugin-descriptor.properties文件中,修改成对应的ES版本

GET /_analyze
{
  "analyzer": "ik_smart",
  "text":"Offer收割机"
}
PUT world
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "song":{
        "type": "text",
        "analyzer": "ik_smart"
      }
    }
  }
}

3 Nested嵌入式

PUT /test_nested
{
  "mappings": {
    "properties": {
      "user":{
        "type": "nested"
      }
    }
  }
}


六、Springboot整合ES

6.1 引依赖

<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.14.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.14.0</version>
</dependency>

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.14.0</version>
    <exclusions>
        <exclusion>
            <artifactId>commons-logging</artifactId>
            <groupId>commons-logging</groupId>
        </exclusion>
    </exclusions>
</dependency>

6.2 写配置文件

spring.elasticsearch.rest.uris[0]=http://localhost:9200

6.3 写测试代码

6.3.1 索引操作

    @Resource
    RestHighLevelClient restHighLevelClient;


    @Test
    public void contextLoads() {
        System.out.println("restHighLevelClient = " + restHighLevelClient);
    }

    @Test
    public void createIndex() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("google");
        request.settings(Settings.builder()
                .put("index.number_of_shards","1")
                .put("index.number_of_replicas","1")
                .build()
        );
        CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println("response = " + response.isAcknowledged()
        );
    }


  @Test
    public void deleteIndex() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("hello");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        boolean b = delete.isAcknowledged();
        System.out.println(b?"删除成功":"删除失败");
    }



6.3.2 待更新 ,嘻嘻

谢谢你的阅读,现在学会了吧,赶快去你的朋友圈中秀一波吧😎

秀归秀,但是由于作者水平还是有限,也难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,各位老板的肯定和关注都是我坚持下去的动力,欢迎来”骚扰“额😘

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试面试题和面试流程

自我介绍部分 .... 项目经历 .... 技能部分 性能 使用什么工具&#xff1f;介绍下最近做的性能测试项目&#xff0c;性能测试过程中遇到哪些问题&#xff1f;性能标准谁来定&#xff1f;你们性能测试的流程是什么&#xff1f;什么是分布式&#xff1f;为什么要用分布式&a…

硅片检测半导体运动台控制器的设计(二)

虽然我国目前对于精密硅片检测运动平台的整机研发还比较空白&#xff0c;但是值得注意的是&#xff0c;对于 X、Y 两自由度运动平台&#xff0c;甚至多自由度运动平台、先进驱动方式和控制策略的研究已经积累了一定的经验&#xff0c;吸收这些经验并应用于本运动平台的研发对选…

分布式系统(事务处理)

文章目录事务&#xff08;Transaction&#xff09;分布式事务原子提交协议单阶段提交两阶段提交三阶段提交串行等价 / 并发控制分布式死锁锁超时全局等待图边追逐算法事务放弃时的恢复服务器崩溃后的恢复恢复文件重组恢复文件日志从Crash 中恢复2PC 的恢复事务&#xff08;Tran…

【Bio】基础生物学 - 化学键 chemical bond

文章目录化学键1. 共价键2. 离子键3. 金属键4. 非共价键5. 氢键Ref.化学键 化学键&#xff08;chemical bond&#xff09;是纯净物分子内或晶体内相邻两个或多个原子&#xff08;或离子&#xff09;间强烈的相互作用力的统称。使离子&#xff08;ion&#xff09;相结合或原子&…

【强化学习笔记】二.价值学习

文章目录Q&A1.DQN工作原理2.如何训练DQN2.1.如何更新模型参数3.2.1.完整走完流程&#xff0c;再更新模型参数。3.2.2.无需走完流程&#xff0c;即可更新模型参数。3.如何将TD算法应用到DQN网络Q&A 问&#xff1a;强化学习的目标是什么&#xff1f; 最大化累计奖励&am…

Windows 的 常用指令操作

目录 1、启动方式 2、修改cmd窗口背景色和字体色 3、文件夹常用指令 4、网络相关常用指令 5、其他常用命令 1、启动方式 用户启动&#xff1a;winR&#xff0c;输入cmd&#xff0c;Enter。 管理员启动&#xff1a;winR&#xff0c;输入cmd&#xff0c;CTRLShiftEnter。 …

Dubbo架构设计与源码解析(二) 服务注册

一、Dubbo简介 &#xfeff;Dubbo是一款典型的高扩展、高性能、高可用的RPC微服务框架&#xff0c;用于解决微服务架构下的服务治理与通信问题。其核心模块包含【RPC通信】和【服务治理】&#xff0c;其中服务治理又分为服务注册与发现、服务容错、负载均衡、流量调度等。今天…

强化学习 —— DQN 代码遇到的问题总结

No module named ‘torch‘ 在把 DQN 代码复制到 PyCharm&#xff0c;点击“运行”后&#xff0c;出现了该报错。是因为当前环境中缺少 pytorch。解决方法&#xff1a; pip install torch如果因为网络问题安装特别慢&#xff0c;可从如下源进行下载&#xff1a; pip install…

php宝塔搭建部署实战开源版OneNav网址导航书签系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的开源版OneNav网址导航书签系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx SQLite3 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&a…

【RuoYi-Vue-Plus】学习笔记 46 - Redisson(十二)布隆过滤器 BloomFilter 简单分析

文章目录前言参考目录测试方法配置说明Demo 方法功能调用流程分析1、布隆过滤器的初始化 tryInit1.1、创建布隆过滤器1.2、初始化布隆过滤器1.2.1、计算 bit 位数1.2.2、计算 Hash 函数个数1.2.3、保存过滤器配置Redis 实际执行结果2、将待比较元素存入布隆过滤器 addRedis 实际…

QT QMenuBra QMenu QAction 菜单栏 操作详解

本文详细的介绍了QMenuBra QMenu QAction 菜单栏的各种操作&#xff0c;例如操作&#xff1a;新建界面、加入菜单项、加入子菜单、新建二级子菜单、QAction分隔符、pMenuBar、点击信号、触发信号、设置图标、设置禁用、设置提示语 等操作 本文作者原创&#xff0c;未经允许禁止…

Eclipse常用设置

Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具 目录 1.解决中文乱码设置propertiew编码 2.更改字体大小 3.设置护眼颜色 4.修…

Usaco Training刷怪旅 第二层第一题:Milking Cows

usaco training 关注我持续更新usaco training内容 Three farmers rise at 5 am each morning and head for the barn to milk three cows. The first farmer begins milking his cow at time 300 (measured in seconds after 5 am) and ends at time 1000. The second farmer …

Go语言入门【09】结构体

结构体 相比于Java&#xff0c;在Go语言中没有类的概念&#xff0c;但是多了结构体。结构体与Java中的类很像&#xff0c;是表示一系列同一类型或不同类型的数据构成的数据集合。 例如可以将学生抽象成一个结构体&#xff0c;每一个学生有以下属性&#xff1a; Name&#xf…

基于pytorch搭建CNN 对人像是否戴口罩进行检测分类 详细教程

项目介绍 我们将使用 CNN (卷积神经网络)和机器学习分类器创建一个检测一个人是否戴着口罩的分类器。它将检测一个人是否戴着口罩。 我们将从头开始学习,我将对每一步进行解释。我需要你对机器学习和数据科学有基本的了解。我已经在本地 Windows 10 机器上实现了它,如果你…

A-Level/IB/AP不同课程体系分数可以相互转换吗?

都知道国际学校有不同的课程体系&#xff0c;也会有不同的考试体系。比如A-Level、IB、SAT/ACT和AP&#xff1b;甚至还有国内的高考体系。所以可能有同学家长会问&#xff0c;不同体系之间的分数是否能够进行对比呢&#xff1f; 严格来讲&#xff0c;其实不好对比&#xff0c;但…

wy的leetcode刷题记录_Day59

wy的leetcode刷题记录_Day59 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-12-9 前言 目录wy的leetcode刷题记录_Day59声明前言1780. 判断一个数字是否可以表示成三的幂的和题目介绍思路代码收获63. 题目题目介绍思路代码收获178…

m基于RFID和DBSCAN聚类的InSAR室内三维定位算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 许多室内应用需要有关物体的空间信息。示例应用程序包括项目查找&#xff0c;对象级别映射和在仓库或库中管理的大型对象。然而&#xff0c;使用802.11&#xff0c;可见光或声学的基于位置的服务…

浏览器里console是异步的

console我一直以为是同步执行的&#xff0c;直到在一本书上看到&#xff0c;才了解到console本身有异步的特性。虽然在平常开发中经常使用console&#xff0c;但是真的没有意识到它的异步性。 下面就看下异步的实例 基础类型 该类型是我们开发中经常使用的&#xff0c;正是这…

01VSCode配置Anaconda 环境和调试环境

VSCode配置Anaconda 环境 Anaconda 简介 自带Python解释器Anaconda 附带了一大批常用数据科学包150 多个科学包及其依赖项Anaconda 是在 conda&#xff08;一个包管理器和环境管理器&#xff09;上发展出来的&#xff0c;包含了虚拟环境管理工具通过虚拟环境可以使不同的Pyth…