ElasticSearch学习笔记三:基础操作(一)

一、前言

上一篇文章中,我们学习了如何使用Java客户端去连接并且简单的操作ES,今天我们将对ES中的基本操作进行学习,包括索引操作、映射操作、文档操作。

二、索引操作

简单回顾一下索引,ES中的索引就有相同结构的数据的集合,对应到关系型数据库例如Mysql中就是表。接下来我们学习索引的基本操作。

1、创建索引

语法:

PUT /索引名
{
  "settings":{
    ....
  },
  "mappings":{
    "properties":{
      "field1": { "type": "类型" },
      "field2": { "type": "类型2" }
      ...
    }
  },
  "aliases": {
    ....
  }
}

settings:表示对当前索引设置一些属性,包括但不限于 分片数量、副本分片数。

mappings:表示映射,即A字段是什么类型,B字段是什么类型。

aliases:别名,可以给索引设置别名。

例如我们要创建一个酒店(hotel)索引,副本数为1,分片数为1(因为目前是单机),有3个字段 id、name、price。

PUT /hotel
{
  "settings": {
    "number_of_replicas": 1,
    "number_of_shards": 1
  },
  "mappings": {
      "properties": {
        "id":{
          "type": "long"
        },
        "name":{
          "type": "text"
        },
        "price":{
          "type": "double"
        }
      }
    }
}

类似于Mysql中的

CREATE TABLE hotel (
    id BIGINT PRIMARY KEY,
    name VARCHAR(255),
    price DOUBLE
) ENGINE=InnoDB;

2、删除索引

DLETE /{索引名}

删除索引,没太多可以说的就是把索引删除掉,类似Mysql中的Drop Table

3、关闭索引

在某些场景下,某个索引暂时不使用了,但时候后期可能又会使用,比如归档了,此时可以把当前索引关闭,被关闭的索引将不能写入和搜索,只能通过ES特定的API或者监控工具能看到索引的元数据信息。

语法:POST /索引名/_close

例如:POST /hotel/_close

4、打开索引

有关闭索引那么一定就有开启索引,也很好理解就是把关闭的索引重新打开,让他可以继续写入和搜索。

语法:POST /索引名/_open

例如:POST/索引名/_open

5、索引别名

顾名思义就是给索引设置一个别名,是索引别名和索引之间建立某种逻辑关系。Mysql中也有别名,例如在使用JOIN的时候我们通常会使用别名(select t1.id,t2.name from table t1 left join on table t2 on t1.id = t2.id)

这里列举一个ES中别名的使用场景,例如我们建立了3个索引,分别代表hotel(酒店)1,2,3月份的入住情况,假设此时是4月了,我们想查询1~3月的数据,则需要分别查询1月的索引、2月的索引、3月的索引这样代码整体就不优雅了,所以我们可以给这个3个索引设置相同的别名,例如就叫 last_three_month,那么在应用层只要直接对last_three_month 进行搜索即可,这里也就是我们说的建立了逻辑上的关联,如下图

语法

POST _aliases
{
  "actions": [
    {
      "add": {
        "index": "索引名",
        "alias": "别名"
      }
    },
    {
      "add": {
        "index": "索引名2",
        "alias": "别名"
      }
    }
  ]
}

(详细的API:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/indices-aliases.html)

如果一个别名关联了多个索引,查询是没问题的,写入则不行,因为ES无法确定你究竟要向那个索引写入,所以写入的时候还是要指定对应索引名。

.

三、映射操作

映射:Mapping,指的是字段和类型的关系,就好比MySQL中的表。接下来我们学习如何操作索引

1、查询索引

语法:GET /索引名/_mapping

案例:GET /hotel/_mapping

结果:

{
  "hotel" : {
    "mappings" : {
      "properties" : {
        "city" : {
          "type" : "keyword"
        },
        "price" : {
          "type" : "double"
        },
        "title" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        }
      }
    }
  }
}

2、修改索引

在我们开发的过程中可能会涉及到对索引的修改,很遗憾ES不能修改映射中的字段类型,所以说修改可能不是很准确说是扩展索引,比如可以增加一个字段。

语法

PUT /索引名/_mapping
{
  "properties":{
    "字段":{
      "type":"类型"
    }
  }
}


例如:
#给hotel索引新增description字段,类型为text,使用ik_max_word分词器
PUT /hotel/_mapping
{
  "properties":{
    "description":{
      "type":"text",
       "analyzer": "ik_max_word"
    }
  }
}


此时我们再次查看索引

GET /hotel/_mapping

结果

{
  "hotel" : {
    "mappings" : {
      "properties" : {
        "city" : {
          "type" : "keyword"
        },
        "description" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        },
        "price" : {
          "type" : "double"
        },
        "title" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        }
      }
    }
  }
}
3、基本数据类型

既然提到了索引,不得不提的就是ES中的基本数据类型,下面我们详细的说一下ES中的基本数据类型

3.1、keyword类型

keyword,关键词类型,该类型不参与分词(什么是分词这个会放到后续学习原理的时候再学习),简单的来说keyword类型的内容不会被切分,会当成完整的内容直接构建倒排索引(倒排索引是ES之所以这么快的原因之一,之后的学习也会学到)keyword一般用于对文档进行过滤,排序和聚合,例如我们通常会把“姓名”、“产品类型”这些不需要切分,或者说切分没有意义的字段设置为keyword类型。keyword只用于全词匹配来搜索。

案例:先写入

POST /hotel/_doc
{
  "city":"杭州",
  "description":"你好啊,这里是杭州如家酒店",
  "price":200,
  "title":"杭州如家酒店"
}

查询city字段

#查询案例1GET /hotel/_search
{
  "query": {
    "match": {
      "city": "杭"
    }
  }
}

结果1{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 0,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  }
}


#查询案例2GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "杭州"
      }
    }
  }
}
结果2{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "_OFHP5MBAePmk6wB4nHX",
        "_score" : 0.2876821,
        "_source" : {
          "city" : "杭州",
          "description" : "你好啊,这里是杭州如家酒店",
          "price" : 200,
          "title" : "杭州如家酒店"
        }
      }
    ]
  }
}

3.2、Text类型

Text文本类型,和keyword不同,Text类型会被分词,在写入数据的时候ES会使用指定(或者默认)的分词器对Text类型的字段内容进行分词,例如的内容是 “杭州如家酒店”,可能会被分为 “杭州”、“如家”、“酒店”这几个词,然后根据这几个词去构建倒排索引。案例:

案例1
GET /hotel/_search
{
  "query": {
    "match": {
      "description": "如家"
    }  
    
  }
}

结果1{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.58446556,
    "hits" : [
      {
        "_index" : "hotel",
        "_type" : "_doc",
        "_id" : "__OFHP5MBAePmk6wB4nHX",
        "_score" : 0.58446556,
        "_source" : {
          "city" : "杭州",
          "description" : "你好啊,这里是杭州如家酒店",
          "price" : 200,
          "title" : "杭州如家酒店"
        }
      }
    ]
  }
}

GET /hotel/_search
{
  "query": {
    "match": {
      "description": "这里"
    }  
    
  }
}

#结果2:同上不在赘述

3.3、数值类型

ES中支持的数值类型包括,long、integer、short、byte、double、float、hafl_float、scaled_floadt和unsigned_long,具体的数值范围可以参考官网(https://www.elastic.co/guide/en/elasticsearch/reference/current/number.html),可以结合实际业务使用最合适的类型,这里不多赘述

3.4、布尔类型

布尔类型,用boolean定义用于表示是否,true或者false,这个相对简单。

3.5、日期类型

在ES中用date来表示日期类型,ES存储的日期是标准的UTC格式。一般使用如下的形式表示日期类型数据

- 格式化的日期字符串
- 毫秒级的时间戳
- 秒级时间戳

案例:

PUT /hotel
{
  "mappings": {
    "properties": {
      "title":{
        "type": "text",
          "analyzer": "ik_max_word"
      },
      "city":{
        "type": "keyword"
      
      },
      "price":{
        "type": "double"
      },
      "create_time":{
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}
4、复杂数据类型

受限于篇幅,这部分内容放在下一篇文章中继续

四、总结

今天的文章详细讲述了索引和映射的操作,同时也介绍了ES中的基本数据类型,下一篇文章讲继续讲解ES中的复杂数据类型,以及对文档的操作,希望对你有所帮助。

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

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

相关文章

【AIGC】如何使用高价值提示词Prompt提升ChatGPT响应质量

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 💯前言💯提示词英文模板💯提示词中文解析1. 明确需求2. 建议额外角色3. 角色确认与修改4. 逐步完善提示5. 确定参考资料6. 生成和优化提示7. 生成最终响…

通过华为鲲鹏认证发行上市的集成平台产品推荐

华为鲲鹏认证是技术实力与品质的权威象征,代表着产品达到了高标准的要求。从技术层面看,认证确保产品与华为鲲鹏架构深度融合,能充分释放鲲鹏芯片的高性能、低功耗优势,为集成平台的高效运行提供强大动力。在安全方面,…

500左右的骨传导耳机哪个牌子好?用户体验良好的五大骨传导耳机

作为一名拥有十几年从业经验的科技爱好者,我主要想告诉大家一些关于骨传导耳机的知识。其中,要远离所谓的不专业产品,它们的佩戴不适和音质不佳问题高得吓人,尤其是很多宣称能提供舒适佩戴和高音质的产品,超过九成的用…

【MySQL】RedHat8安装mysql9.1

一、下载安装包 下载地址:MySQL Enterprise Edition Downloads | Oracle MySQL :: MySQL Community Downloads 安装包:mysql-enterprise-9.1.0_el8_x86_64_bundle.tar 官方 安装文档:MySQL Enterprise Edition Installation Guide 二、安装…

Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在共享经济…

three.js 对 模型使用 视频进行贴图修改材质

three.js 对 模型使用 视频进行贴图修改材质 https://threehub.cn/#/codeMirror?navigationThreeJS&classifyapplication&idvideoModel import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls.js import { GLTFLoad…

智能指针原理、使用和实现——C++11新特性(三)

目录 一、智能指针的理解 二、智能指针的类型 三、shared_ptr的原理 1.引用计数 2.循环引用问题 3.weak_ptr处理逻辑 四、shared_ptr的实现 五、定制删除器 六、源码 一、智能指针的理解 问题:什么是智能指针?为什么要有智能指针?智…

基于SpringBoot和uniapp开发的医护上门系统上门护理小程序

项目分析 一、市场需求分析 人口老龄化趋势:随着全球及中国人口老龄化的加剧,老年人口数量显著增加,对医疗护理服务的需求也随之增长。老年人由于身体机能下降,更需要便捷、高效的医护服务,而医护上门服务恰好满足了这…

Java——并发工具类库线程安全问题

摘要 本文探讨了Java并发工具类库中的线程安全问题,特别是ThreadLocal导致的用户信息错乱异常场景。文章通过一个Spring Boot Web应用程序示例,展示了在Tomcat线程池环境下,ThreadLocal如何因线程重用而导致异常,并讨论了其他并发…

Java-异常处理机制

Java-异常处理机制 一、异常概述1、异常的抛出机制2、如何对待异常3、异常的体系结构3.1、Throwable3.2、Error和Exception3.3、编译时异常和运行时异常3.4、常见的异常有哪些? 二、异常的处理方式一 try-catch的使用1、过程1:抛2、过程2:抓3…

MySQL深度剖析-索引原理由浅入深

什么是索引? 官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

canva 画图 UI 设计

起因, 目的: 来源: 客户需求。 目的: 用数据讲故事。 数据可以瞎编,图表一定要漂亮。 文件分享地址 读者可以在此文件的基础上,继续编辑。 效果图 过程: 我还是喜欢 canva. figma, 我用的时候,每每都想…

HTTP 缓存策略

文章目录 一、HTTP的缓存的过程是怎样的?二、什么时候触发强缓存或协商缓存强缓存ExpiresCache-Control 协商缓存 三、服务器如何判断资源是否新鲜Last-Modified/If-Modified-SinceETag/If-None-Match 四、整体缓存过程 一、HTTP的缓存的过程是怎样的? …

使用OkHttp进行HTTPS请求的Kotlin实现

OkHttp简介 OkHttp是一个高效的HTTP客户端,它支持同步和异步请求,自动处理重试和失败,支持HTTPS,并且可以轻松地与Kotlin协程集成。OkHttp的设计目标是提供最简洁的API,同时保持高性能和低延迟。 为什么选择OkHttp …

前端学习八股资料CSS(五)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

5个有效的华为(HUAWEI)手机数据恢复方法

5个有效的手机数据恢复方法 华为智能手机中的数据丢失比许多人认为的更为普遍。发生这种类型的丢失有多种不同的原因,因此数据恢复软件的重要性。您永远不知道您的智能手机何时会在这方面垮台;因此,预防总比哀叹好,这就是为什么众…

数据结构 (1)基本概念和术语

一、基本概念 数据(Data): 是对客观事物的符号表示,在计算机科学中通常指计算机程序所处理的各种对象。数据可以是数值、字符、图像、声音等任何形式的信息。数据元素(Data Element): 也称为数据…

SpringBoot源码解析(四):解析应用参数args

SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args 目录…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址:功能展示项目结构项目引用1. 新建模型2. Data层,依赖EF Core,实现数据库增删改查3. Bussiness层,实现具体的业务逻辑4. Service层&am…

c++学习第三天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、内联函数 1.铺垫 #include<iostream>//实现一个ADD的宏函数 //#define ADD(x, y) xy //错解1 //#defin…