551、Elasticsearch详细入门教程系列 -【分布式全文搜索引擎 Elasticsearch(二)】 2023.04.04

目录

    • 一、Elasticsearch创建/查看/删除索引、创建/查看/修改/删除文档、映射关系
      • 1.1 Elasticsearch中的数据格式
      • 1.2 索引操作
        • 1.2.1 创建索引
        • 1.2.2 查看指定索引
        • 1.2.3 查看全部索引
        • 1.2.4 删除索引
      • 1.3 文档操作
        • 1.3.1 创建文档
        • 1.3.2 查看单个文档:主键查询
        • 1.3.3 查看所有文档:全查询
        • 1.3.4 修改文档中的全部字段
        • 1.3.5 修改文档中的某个字段
        • 1.3.6 删除文档
        • 1.3.7 条件查询文档内容
        • 1.3.8 分页查询+排序文档内容
        • 1.3.9 多条件查询:and
        • 1.3.10 多条件查询:or
        • 1.3.11 多条件查询:大于、小于
        • 1.3.12 全文查询+高亮显示
        • 1.3.13 聚合查询:根据价格分组、对价格求平均值
      • 1.4 映射操作
    • 二、参考链接

一、Elasticsearch创建/查看/删除索引、创建/查看/修改/删除文档、映射关系

1.1 Elasticsearch中的数据格式

Elasticsearch 是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将 Elasticsearch
里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比。

在这里插入图片描述

ES 里的 Index 可以看做一个库,而 Types 相当于表,Documents 则相当于表的行。这里 Types
的概念已经被逐渐弱化,Elasticsearch 6.X 中,一个 index 下已经只能包含一个 type,Elasticsearch 7.X 中, Type 的概念已经被删除了。

1.2 索引操作

1.2.1 创建索引

在ES中创建一个索引,就相当于在mysql中创建了一个数据库,而mysql中的数据库肯定是不能重复的,也即ES中的索引也不能重复,所以这是一个幂等性操作,需要发送PUT请求(如果重复发送PUT请求、重复添加索引,会返回错误信息),这里不能发送POST请求。

在这里插入图片描述

1.2.2 查看指定索引

在postman中,向ES服务器发送GET请求。这里的路径和上边的创建索引是一样的,只是请求方式不一样

在这里插入图片描述

1.2.3 查看全部索引

在 Postman 中,向 ES 服务器发 GET 请求。
health 当前服务器健康状态:green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副本数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小

在这里插入图片描述

1.2.4 删除索引

在 Postman 中,向 ES 服务器发 DELETE 请求。

在这里插入图片描述

1.3 文档操作

1.3.1 创建文档

索引已经创建好了,接下来我们来创建文档,并添加数据。这里的文档可以类比为关系型数据库中的表数据,添加的数据格式为 JSON 格式

在 Postman 中,向 ES 服务器发 POST 请求。

{
	"title":"小米手机",
	"category":"小米",
	"image":"http://www.szh.com/szh.jpg",
	"price":3999.00
}

在这里插入图片描述

上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。

如果想要自定义唯一性标识,需要在创建时指定。推荐使用下面这种方式创建文档。

在这里插入图片描述

1.3.2 查看单个文档:主键查询

查看文档时,需要指明文档的唯一性标识,类似于 MySQL 中数据的主键查询。在 Postman 中,向 ES 服务器发 GET 请求。

在这里插入图片描述

1.3.3 查看所有文档:全查询

“query”:这里的query代表一个查询对象,里面可以有不同的查询属性

“match_all”:查询类型,例如:match_all(代表查询所有),match,term,range等等

{查询条件}:查询条件会根据类型的不同,写法也有差异

在这里插入图片描述

1.3.4 修改文档中的全部字段

修改数据时,也可以只修改某一给条数据的局部信息,也可以修改所有字段信息。

修完完之后,再次发送GET请求,查看修改后的文档内容。

{
   "title":"OPPO手机",
   "category":"OPPO",
   "images":"http://www.szh.com/szh.jpg",
   "price":2400.00
}

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

1.3.5 修改文档中的某个字段

{
   "doc" : {
       "title":"VIVO手机",
       "category":"VIVO"
   }
}

在这里插入图片描述

在这里插入图片描述

1.3.6 删除文档

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。在 Postman 中,向 ES 服务器发 DELETE 请求。

在这里插入图片描述

1.3.7 条件查询文档内容

match 匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是 or 的关系。

在 Postman 中,向 ES 服务器发 GET 请求。

在这里插入图片描述

上面这种查询方式的请求参数是直接跟在请求路径之后的,这种方式不太好,因为可能会造成乱码问题。

所以一般采用下面这种方式,将请求参数存放在请求体中。

{
   "query" : {
       "match" : {
           "category" : "华为"
       }
   }
}

在这里插入图片描述

1.3.8 分页查询+排序文档内容

默认情况下,Elasticsearch 在搜索的结果中,会把文档中保存在_source
的所有字段都返回。如果我们只想获取其中的部分字段,我们可以添加_source 的过滤

sort 可以让我们按照不同的字段进行排序,并且通过 order 指定排序的方式。desc 降序,asc 升序。

from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size。

size:每页显示多少条。

{
   "query" : {
       "match_all" : {

       }
   },
   "from" : 0, // (页码-1)*每页条数, 第一页:(1-1)*2=0, 第二页:(2-1)*2=2
   "size" : 2,
   "_source" : ["title","price"],
   "sort" : {
       "price" : {
           "order" : "desc"
       }
   }
}

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

1.3.9 多条件查询:and

bool把各种其它查询通过must(必须 and )、must_not(必须不)、should(应该 or)的方式进行组合 。

{
	"query" : {
		"bool" : {
			"must" : [
				{
					"match" : {
						"category" : "小米"
					}
				},
				{
					"match" : {
						"price" : 3999.00
					}
				}
			]
		}
	}
}

在这里插入图片描述

1.3.10 多条件查询:or

bool把各种其它查询通过must(必须 and )、must_not(必须不)、should(应该 or)的方式进行组合 。

{
	"query" : {
		"bool" : {
			"should" : [
				{
					"match" : {
						"category" : "VIVO"
					}
				},
				{
					"match" : {
						"price" : 5999.00
					}
				}
			]
		}
	}
}

在这里插入图片描述

1.3.11 多条件查询:大于、小于

range 查询找出那些落在指定区间内的数字或者时间。range 查询允许以下字符: gt 大于> gte 大于等于>= lt 小于<
lte 小于等于<=

{
	"query" : {
		"bool" : {
			"must" : [
				{
					"match" : {
						"category" : "小米"
					}
				}
			],
			"filter" : {
				"range" : {
					"price" : {
						"gt" : 3000.00,
                       "lt" : 4000.00
					}
				}
			}
		}
	}
}

在这里插入图片描述

1.3.12 全文查询+高亮显示

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。

在使用 match 查询的同时,加上一个 highlight 属性:

pre_tags:前置标签 post_tags:后置标签 fields:需要高亮的字段 title:这里声明 title
字段需要高亮,后面可以为这个字段设置特有配置,也可以空

{
   "query" : {
       "match_phrase" : {
           "category" : "小"
       }
   },
   "highlight" : {
       "fields" : {
           "category" : {}
       }
   }
}

在这里插入图片描述

当我们将查询条件中的 match_phrase 改为 match 之后,再次查询,结果仍然是有的。这就很奇怪了,我文档中分类信息只有 小米 、没有 小 啊,为什么还能查询到结果呢? 这是因为ES在保存文档数据时,会将数据进行分词、拆解操作,并将拆解后的数据保存到倒排索引中,这样即使使用文字的一部分(小米可以查询到、小也可以查询到)也能查询到数据,这种方式就称为 全文检索。 也就是说文档中的category是小米,

通过 小、米、小米 均可以查询到。

如果我们写的是 小华,则ES会帮我们查询出:%小%、%华% 相关的所有数据,这里就是进行了数据分词、拆解,进而采用倒排索引的方式查询。

假如说,我不想采用采用这种全文检索的匹配模式,需要将 match 改为 match_phrase。

在这里插入图片描述

1.3.13 聚合查询:根据价格分组、对价格求平均值

聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的 group by,当然还有很多其他的聚合,例如取最大值、平均值等等。

对某个字段取最大值 max
对某个字段取最小值 min
对某个字段求和 sum
对某个字段取平均值 avg
对某个字段的值进行去重之后再取总数 distinct

{
   "aggs" : { //聚合操作
       "price_group" : { //名称,自定义
           "terms" : { //分组
               "field" : "price" //分组字段
           }
       }
   },
   "size" : 0
}

在这里插入图片描述

{
   "aggs" : { //聚合操作
       "price_avg" : { //名称,自定义
           "avg" : { //分组
               "field" : "price" //分组字段
           }
       }
   },
   "size" : 0
}

在这里插入图片描述

1.4 映射操作

有了索引库,等于有了数据库中的 database。

接下来就需要建索引库(index)中的映射了,类似于数据库(database)中的表结构(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。

  • 字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price

  • type:类型,Elasticsearch 中支持的数据类型非常丰富,说几个关键的: ​ String 类型,又分两种: ​

  • text:可分词

  • keyword:不可分词,数据会作为完整字段进行匹配 ​ Numerical:数值类型,分两类 ​

基本数据类型:long、integer、short、byte、double、float、half_float ​
浮点数的高精度类型:scaled_float ​ Date:日期类型 ​ Array:数组类型 ​ Object:对象

  • index:是否索引,默认为 true,也就是说你不进行任何配置,所有字段都会被索引。 ​ true:字段会被索引,则可以用来进行搜索 ​
    false:字段不会被索引,不能用来搜索

  • store:是否将数据进行独立存储,默认为 false ​ 原始的文本会存储在_source
    里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source
    里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source
    中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置

  • analyzer:分词器,这里的 ik_max_word 即使用 ik 分词器

首先是 http://127.0.0.1:9200/user ,发送PUT请求,创建一个user索引,然后在这个索引下创建一个映射。

就类似于在mysql中创建一个名为 user 的数据库,在这个数据库中定义一张表的结构如下:👇👇👇

text 类型为true表示 name 字段可以支持 分词、拆解 操作的查询;而 keyword 类型为true表示 sex
字段仅支持完全匹配的模式;最后 keyword 类型为false表示 tel 字段不支持查询。

{
	"properties" : {
		"name" : {
			"type" : "text",
			"index" : true
		},
		"sex" : {
			"type" : "keyword",
			"index" : true
		},
		"tel" : {
			"type" : "keyword",
			"index" : false
		}
	}
}

在这里插入图片描述

索引有了,映射也有了(数据库有了,表结构有了,就差向表中添加数据了),也就是需要添加文档内容。

在这里插入图片描述

因为name字段是支持text模式查询,即支持分词、拆解操作,做倒排索引,所以虽然文档中的name字段为张起灵,但是经过分词拆解,name为徐、凤、年、凤年这几种都可以查询出数据。

在这里插入图片描述

由于 sex 字段不支持text分词拆解,仅支持keyword完全匹配的模式,所以源文档数据中 sex 为 man,这里只写个 m
是查询不到的。

在这里插入图片描述

最后的tel字段是最苛刻的,压根不支持text、keyword两种查询,所以这里就算是写成和文档中的 tel 一样,也查询不到,因为 tel 字段不支持查询。

在这里插入图片描述

二、参考链接

分布式全文搜索引擎 Elasticsearch

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

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

相关文章

不敲代码用ChatGPT开发一个App

先说下背景&#xff0c;有一天我在想 ChatGPT 对于成熟的开发者来说已经是一个非常靠谱的助手了&#xff0c;身边也确实有很多同事把它作为一个离不开的助理担当。 但是如果我只是略微懂一点前端知识的新人&#xff0c;了解 HTML、CSS、JS 相关的知识&#xff0c;想开发一个安…

什么是UEFI签名认证?UEFI签名有什么好处?

为了防御恶意软件攻击&#xff0c;目前市面上所有电脑设备启动时默认开启安全启动(Secure Boot)模式。安全启动(Secure Boot)是UEFI扩展协议定义的安全标准&#xff0c;可以确保设备只使用OEM厂商信任的软件启动。UEFI签名认证就是对运行在 UEFI 系统下的 efi 驱动和通过 UEFI …

第10章_创建和管理表

第10章_创建和管理表 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前…

OpenCloudOS 9.0发布,腾讯闯入底层基础软件“深水区”

3月22日&#xff0c;腾讯发布了2022第四季度及全年业绩&#xff0c;ToB业务成为腾讯的核心引擎。与此同时&#xff0c;ToB的腾讯在近年来持续加码自研投入&#xff0c;提升底层技术实力&#xff0c;2022年研发投入达到614亿元&#xff0c;2018年至今在研发上的投入已经超过2056…

Mockito单测之道

Mockito单测之道 去年写过一篇《TestNG单元测试实战》文章&#xff0c;严格来讲算集成测试。 没看的小伙伴可直接看本篇即可&#xff0c;本质是单元测试框架不同&#xff0c;写法不一样。 单测定义 单元测试定义&#xff1a; 对软件中最小可测单元进行验证&#xff0c;可理解…

【数据结构】链表练习题(2)

链表练习题1.相交链表(LeetCode160)2.环形链表(LeetCode141)3.环形链表Ⅱ(LeetCode142)1.相交链表(LeetCode160) 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。题目数据 保…

spring注解的使用

Spring的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;Bean是如何加载到容器的&#xff0c;可以使用Spring注解方式或者Spring XML配置方式。 Spring注解方式减少了配置文件内容&#xff0c;更加便于管理&#xff0c;并且使用注解可以大大提高了开发…

你看这个spring的aop它又大又宽

aop&#x1f693;AOP 分类AspectJ | 高级但是难用Spring AOP | 易用但仅支持方法aop 原理明月几时有&#xff0c;把酒问青天。——唐代李白《将进酒》 AOP 分类 在 Spring Boot 中&#xff0c;AOP 的实现主要有以下几种&#xff1a; 基于 AspectJ 的 AOP&#xff1a;这是一种基…

数据结构——红黑树

目录 概念 性质 结点的定义 插入 调整 当p是g的左孩子时 当p为g的右孩子时 插入完整代码 红黑树的检测 红黑树完整代码&#xff08;包括测试数据&#xff09; 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&…

如何有效备考PMP?

随着PMP证书含金量直线上升&#xff01;现在PMP证书就跟黄金一样&#xff0c;即保值又升值。 今天小编应势出一篇关于如何高效备考PMP的方法&#xff0c;在备考生快过来看看吧&#xff01; 1、准备好所需要的教材&#xff0c;视频&#xff0c;试题内容 备考备考&#xff0c;你…

蓝桥杯刷题冲刺 | 倒计时5天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.方格迷宫2.字符串删减1.方格迷宫 题目 链接&#xff1a; 4943. 方格迷宫 - AcWing题库 给定一…

Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外

导读ChatGPT、GPT-4 无疑是 2023 年年初人工智能界最大的「爆款」。3 月 26 日&#xff0c;OpenAI CEO、ChatGPT 之父 Sam Altman 接受了著名学者与科技播客、麻省理工大学研究员 Lex Fridman 的专访&#xff0c;Sam 分享了从OpenAI内部视角如何看待ChatGPT和GPT-4的里程碑式意…

分享:数据库存储与索引技术(三)LSM树实现案例

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 本文来自OceanBase社区分享&#xff0c;仅限交流探讨。原作者马伟&#xff0c;长期从事互联网广告检索系统的研发&#xff0c;对数据库&#xff0c;编译器等领域也有浓厚兴趣。 文章目录1. MemTab…

2.2.2 第2遍:程序细节

这段话主要解释了C程序中#include指令和头文件的作用。头文件包含了编译器所需的信息&#xff0c;例如函数名、常量、以及如何使用它们等。在C程序中&#xff0c;头文件通常用于包含库函数&#xff0c;例如stdio.h文件中包含了输入和输出函数&#xff08;如printf()&#xff09…

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…

Waline在Butterfly主题中的应用

LeanCloud 设置 (数据库) 国内版的LeanCloud需要绑定域名&#xff0c;所以我们直接选择国外版的LeanCloud 登陆注册 注册&#xff1a;点击这里进行跳转注册成功后进入控制台&#xff0c;选择 创建应用 。 创建完成后进入应用&#xff0c;下拉找到 设置 , 会有 AppID 、AppK…

ASO优化之应用商店关键词的实现

投放正确的合适的关键词&#xff0c;能够确保我们的应用获得更高的相关性和知名度。如果我们已经完成研究并想要竞争目标关键词&#xff0c;就需要在商品详情中去实施投放它们。 要在 Google Play Store 中投放——我们要打开 Google Play 控制台并点击“主要应用详情”选项卡…

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VMware创建和使用虚拟网络

文章目录如何打开虚拟网络编辑器让虚拟机使用有线、无线网卡1. 点击“添加网络”2. 虚拟机使用电脑自带无线网卡3. 虚拟机使用电脑自带有线网卡重置虚拟网络在使用虚拟机的过程中&#xff0c;有时会需要让虚拟机使用物理机的网络设备直接与外部连接&#xff0c;例如让虚拟机通过…

Win11启用IE方法

呉師傅 Win11是微软目前的最新系统&#xff0c;尽管该系统非常不错&#xff0c;但是还是有很多不一样的地方&#xff0c;有的用户发现Win11没有了IE浏览器&#xff0c;那么Win11没有IE浏览器怎么办呢&#xff0c;有的旧网页需要IE浏览器才能进入&#xff0c;下面就给大家提供一…