【业务功能篇82】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-进阶实战

四、ElasticSearch进阶

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/getting-started-search.html

1.ES中的检索方式

在ElasticSearch中支持两种检索方式

  1. 通过使用REST request URL 发送检索参数(uri+检索参数)
  2. 通过使用 REST request body 来发送检索参数 (uri+请求体)

第一种方式

GET bank/_search # 检索bank下的所有信息,包括 type 和 docs

GET bank/_search?q=*&sort=account_number:asc

响应结果信息

信息描述
tookElasticSearch执行搜索的时间(毫秒)
time_out搜索是否超时
_shards有多少个分片被搜索了,统计成功/失败的搜索分片
hits搜索结果
hits.total搜索结果统计
hits.hits实际的搜索结果数组(默认为前10条文档)
sort结果的排序key,没有就按照score排序
score和max_score相关性得分和最高分(全文检索使用)

image.png

第二种方式

通过使用 REST request body 来反射检索参数 (uri+请求体)

GET bank/_search

{"query":{"match_all":{}},"sort":[{"account_number":"desc"  }]
}

image.png

2.Query DSL

2.1 基本语法

  ElasticSearch提供了一个可以执行的JSON风格的DSL(domain-specific language 领域特定语言),这个被称为Query DSL,该查询语言非常全面,并且刚开始的时候感觉有点复杂,真正学好它的方法就是从一些基础案例开始的。

完整的语法结构

{QUERY_NAME:{ARGUMENT:VALUE,ARGUMENT:VALUE,...}
}

如果是针对某个字段,那么它的结构为

{QUERY_NAME:{FIELD_NAME:{ARGUMENT:VALUE,ARGUMENT:VALUE,...}}
}

image.png

2.2 match

  上面我们用到来的match_all是匹配所有的数据,而我们现在要讲的match是条件匹配

如果对应的字段是基本类型(非字符串类型),则是精确匹配。

GET bank/_search
{"query":{"match":{"account_number":20}}
}

match返回的是 account_number:20的记录

image.png

如果对应的字段是字符串类型,则是全文检索

GET bank/_search
{"query":{"match":{"address":"mill"}}
}

match返回的就是address中包含mill字符串的记录

image.png

2.3 match_phrase

将需要匹配的值当成一个整体单词(不分词)进行检索,短语匹配

GET bank/_search
{"query":{"match_phrase":{"address":"mill road"}}
}

查询出address中包含 mill road的所有记录,并给出相关性得分

image.png

2.4 multi_match[多字段匹配]

GET bank/_search
{"query":{"multi_match":{"query":"mill road","fields":["address","state"]}}
}

查询出state或者address中包含 mill road的记录

image.png

2.5 bool[复合查询]

布尔查询又叫组合查询,bool用来实现复合查询,

bool把各种其它查询通过 must(与)、must_not(非)、should(或)的方式进行组合

复合语句可以合并任何其他查询语句,包括复合语句也可以合并,了解这一点很重要,这意味着,复合语句之间可以相互嵌套,可以表达非常复杂的逻辑。

GET /bank/_search
{"query": {"bool": {"must": [{ "match": { "age": "40" } }],"must_not": [{ "match": { "state": "ID" } }]}}
}

image.png

2.6 filter[结果过滤]

  并不是所有的查询都需要产生分数,特别是那些仅用于"filtering"的文档,为了不计算分数,ElasticSearch会自动检查场景并且优化查询的执行。

GET /bank/_search
{"query": {"bool": {"must": { "match_all": {} },"filter": {"range": {"balance": {"gte": 20000,"lte": 30000}}}}}
}

image.png

2.7 term

  和match一样,匹配某个属性的值,全文检索字段用match,其他非text字段匹配用term

GET bank/_search
{"query":{"term":{"account_number":20}}
}

image.png

检索关键字描述
term非text使用
match在text中我们实现全文检索-分词
match keyword在属性字段后加.keyword 实现精确查询-不分词
match_phrase短语查询,不分词,模糊查询

3.聚合(aggregations)

聚合可以让我们极其方便的实现对数据的统计、分析。例如:

  • 什么品牌的手机最受欢迎?
  • 这些手机的平均价格、最高价格、最低价格?
  • 这些手机每月的销售情况如何?

实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。

语法规则

"aggregations" : {"<aggregation_name>" : {"<aggregation_type>" : {<aggregation_body>}[,"meta" : {  [<meta_data_body>] } ]?[,"aggregations" : { [<sub_aggregation>]+ } ]?}[,"<aggregation_name_2>" : { ... } ]*
}

https://www.elastic.co/guide/en/elasticsearch/reference/7.4/search-aggregations.html

3.1 基本概念

Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫 ,一个叫 度量

桶(bucket)

桶的作用,是按照某种方式对数据进行分组,每一组数据在ES中称为一个 ,例如我们根据国籍对人划分,可以得到 中国桶英国桶日本桶……或者我们按照年龄段对人进行划分:010,1020,2030,3040等。

Elasticsearch中提供的划分桶的方式有很多:

  • Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组
  • Histogram Aggregation:根据数值阶梯分组,与日期类似
  • Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组
  • Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组
  • ……

bucket aggregations 只负责对数据进行分组,并不进行计算,因此往往bucket中往往会嵌套另一种聚合:metrics aggregations即度量

度量(metrics)

分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为 度量

比较常用的一些度量聚合方式:

  • Avg Aggregation:求平均值
  • Max Aggregation:求最大值
  • Min Aggregation:求最小值
  • Percentiles Aggregation:求百分比
  • Stats Aggregation:同时返回avg、max、min、sum、count等
  • Sum Aggregation:求和
  • Top hits Aggregation:求前几
  • Value Count Aggregation:求总数
  • ……

3.2 案例讲解

案例1:搜索address中包含mill的所有人的年龄分布以及平均年龄

GET /bank/_search
{"query": {"match": {"address": "mill"}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 10}},"ageAvg":{"avg": {"field": "age"}}},"size": 0 
}

image.png

案例2:按照年龄聚合,并且请求这些年龄段的这些人的平均薪资

GET /bank/_search
{"query": {"match_all": {}},"aggs": {"ageAgg": {"terms": {"field": "age","size": 50},"aggs": {"balanceAvg": {"avg": {"field": "balance"}}}}},"size": 0
}

image.png

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

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

image.png

4.映射配置(_mapping)

查看索引库中所有的属性的_mapping

image.png

4.1 ElasticSearch7-去掉type概念:

  关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,但ES中不是这样的。elasticsearch是基于Lucene开发的搜索引擎,而ES中不同type下名称相同的filed最终在Lucene中的处理方式是一样的。

  两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,你必须在两个不同的type中定义相同的filed映射。否则,不同type中的相同字段名称就会在处理中出现冲突的情况,导致Lucene处理效率下降。

  去掉type就是为了提高ES处理数据的效率。

Elasticsearch 7.x

URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型。

Elasticsearch 8.x

不再支持URL中的type参数。

解决:将索引从多类型迁移到单类型,每种类型文档一个独立索引

4.2 什么是映射?

  映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等

4.3 创建映射字段

PUT /索引库名/_mapping/类型名称
{"properties": {"字段名": {"type": "类型","index": true"store": true"analyzer": "分词器"}}
}

类型名称:就是前面将的type的概念,类似于数据库中的不同表

字段名:类似于列名,properties下可以指定许多字段。

每个字段可以有很多属性。例如:

  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里使用ik分词器:ik_max_word或者ik_smart

image.png

4.4 新增映射字段

  如果我们创建完成索引的映射关系后,又要添加新的字段的映射,这时怎么办?第一个就是先删除索引,然后调整后再新建索引映射,还有一个方式就在已有的基础上新增。

PUT /my_index/_mapping
{"properties":{"employee-id":{"type":"keyword","index":false}}
}

image.png

4.5 更新映射

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

4.6 数据迁移

先创建出正确的索引,然后使用如下的方式来进行数据的迁移

POST_reindex [固定写法]
{
“source”:{
“index”:“twitter”
},
“dest”:{
“index”:“new_twitter”
}
}

老的数据有type的情况

POST_reindex [固定写法]
{
“source”:{
“index”:“twitter”,
“type”:“account”
},
“dest”:{
“index”:“new_twitter”
}
}

案例:新创建了索引,并指定了映射属性image.png

image.png

5.分词

  所谓的分词就是通过tokenizer(分词器)将一个字符串拆分为多个独立的tokens(词元-独立的单词),然后输出为tokens流的过程。

例如"my name is HanMeiMei"这样一个字符串就会被默认的分词器拆分为[my,name,is HanMeiMei].ElasticSearch中提供了很多默认的分词器,我们可以来演示看看效果

image.png

image.png

但是在ElasticSearch中提供的分词器对中文的分词效果都不好。

image.png

所以这时我们就需要安装特定的分词器 IK

1) 安装ik分词器

https://github.com/medcl/elasticsearch-analysis-ik 下载对应的版本,然后解压缩到plugins目录中

image.png

然后检查是否安装成功:进入容器 通过如下命令来检测

image.png

检查下载的文件是否完整,如果不完整就重新下载。

image.png

插件安装OK后我们重新启动ElasticSearch服务

2) ik分词演示

ik_smart分词

# 通过ik分词器来分词
POST /_analyze
{"analyzer": "ik_smart","text": "我是中国人,我热爱我的祖国"
}

image.png

ik_max_word

POST /_analyze
{"analyzer": "ik_max_word","text": "我是中国人,我热爱我的祖国"
}

image.png

通过ik分词器的使用我们发现:如果使用ElasticSearch中默认提供的分词器是不支持中文分词的,也就是我们在定义一个索引的使用不能使用默认的mapping,而是要手动的来建立对应的mapping,在mapping我们需要选择对应的分词器。

3) 自定义词库

虚拟机扩容

安装的软件越来越多,虚拟机的空间有限,这时我们可以关闭虚拟机后扩容

image.png

ElasticSearch中原来分配的空间比较小,虚拟机空间增大后我们可以调整ElasticSearch的空间。

调整ElasticSearch的虚拟机内存,我们没办法直接修改,需要先删除原来的容器,然后创建新的容器。

image.png

调整JVM参数后重新启动容器:

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

image.png

Nginx安装

先安装一个简单的Nginx实例,来获取对应的配置信息

拉取Nginx的镜像

image.png

启动Nginx服务

docker run -d -p 80:80 --name nginx nginx:1.10

image.png

把容器中的配置文件拷贝到/mydata/nginx目录中

docker container cp nginx:/etc/nginx .

image.png

有了这个对应的配置文件夹后我们就可以删除掉之前的Nginx服务了

image.png

然后创建新的Nginx服务

docker run -d -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
nginx:1.10

image.png

测试访问:

image.png

实现自定义词库

我们需要在Nginx中创建对应的词库文件

image.png

然后我们在ik分词器的插件的配置文件中修改远程词库的地址

/mydata/elasticsearch/plugins/ik/config

image.png

image.png

然后保存文件重启ElasticSearch服务即可

image.png

然后在Kibana中检索测试即可

image.png

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS HealthKit 介绍

文章目录 一、简介二、权限配置1. 在开发者账号中勾选HealthKit2. 在targets的capabilities中添加HealthKit。3. infoPlist需要配置权限 三、创建健康数据管理类1. 引入头文件2. 健康数据读写权限3. 检查权限4. 读取步数数据5. 写入健康数据 四、运行获取权限页面 一、简介 He…

1 Hadoop入门

1.Hadoop是什么&#xff1f; (1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 (2)主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 (3)广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 2.Hadoop的优势 3 Hadoop组成 4 HDF…

DevOps之自动化测试

什么是自动化测试&#xff1f; 明确一下自动化测试不是什么。自动化测试不是指自动化生成测试代码&#xff0c;而是自动化地执行由开发人员或测试人员编写的测试代码。正如下面这句谚语&#xff1a;“绝不要手工去做任何可以被自动化处理的事情。——Curt Hibbs” 之前是由人…

【C++】—— c++11新的类功能

目录 &#xff08;一&#xff09;默认成员函数 1、 移动构造函数 2、代码辅助理解 3、移动赋值运算符重载 &#xff08;二&#xff09;default关键字 &#xff08;三&#xff09;delete关键字 &#xff08;四&#xff09;委托构造函数 1、优势 2、缺点 总结 &#x…

ubuntu学习(四)----文件写入操作编程

1、write函数的详解 ssize_t write(int fd,const void*buf,size_t count); 参数说明&#xff1a; fd:是文件描述符&#xff08;write所对应的是写&#xff0c;即就是1&#xff09; buf:通常是一个字符串&#xff0c;需要写入的字符串 count&#xff1a;是每次写入的字节数…

vue中实现echarts三维散点图

需要安装 echarts 同时引入 echarts-gl 我安装的版本&#xff1a; "echarts": "^5.3.2", "echarts-gl": "^2.0.9", import Vue from "vue"; import * as echarts from "echarts"; Vue.prototype.$echarts echa…

温故知新之:代理模式,静态代理和动态代理(JDK动态代理)

0、前言 代理模式可以在不修改被代理对象的基础上&#xff0c;通过扩展代理类&#xff0c;进行一些功能的附加与增强。 1、静态代理 静态代理是一种代理模式的实现方式&#xff0c;它在编译期间就已经确定了代理对象&#xff0c;需要为每一个被代理对象创建一个代理类。静态代…

36、springboot --- 对 tomcat服务器 和 undertow服务器 配置访客日志

springboot 配置访客日志 ★ 配置访客日志&#xff1a; 访客日志&#xff1a; Web服务器可以将所有访问用户的记录都以日志的形式记录下来&#xff0c;主要就是记录来自哪个IP的用户、在哪个时间点、访问了哪个资源。 Web服务器可将所有访问记录以日志形式记录下来&#xff…

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip&#xff0c;测试起来有些麻烦&#xff0c;故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置&#xff1a; 点击编辑&#xff0c;打开虚拟网络配置 2. 选中nat模式&#xff0c;点击nat设置&#xff0c;最终获取网关ip: 192.168.164.2 3. 进…

CleanMyMac2024永久版Mac清理工具

Mac电脑作为相对封闭的一个系统&#xff0c;它会中毒吗&#xff1f;如果有一天Mac电脑产生了疑似中毒或者遭到恶意不知名攻击的现象&#xff0c;那又应该如何从容应对呢&#xff1f;这些问题都是小编使用Mac系统一段时间后产生的疑惑&#xff0c;通过一番搜索研究&#xff0c;小…

CK-GW06-E03与汇川PLC的EtherNet/IP通信

准备阶段&#xff1a; CK-GWO6-E03网关POE交换机网线汇川PLC编程软件汇川AC801-0221-U0R0型号PLC 1.打开汇川PLC编程软件lnoProShop(V1.6.2)SP2 新建工程&#xff0c;选择对应的PLC型号&#xff0c;编程语言选择为“结构化文本&#xff08;ST&#xff09;语言”&#xff0c;然…

线性代数(五) 线性空间

前言 《线性代数(三) 线性方程组&向量空间》我通过解线性方程组的方式去理解线性空间。此章从另一个角度去理解 空间是什么 大家较熟悉的&#xff1a;平面直角坐标系是最常见的二维空间 空间由无穷多个坐标点组成 每个坐标点就是一个向量 反过来&#xff0c;也可说&…

kafka--技术文档--架构体系

架构体系 Kafka的架构体系包括以下几个部分&#xff1a; Producer. 消息生产者&#xff0c;就是向Kafka broker发送消息的客户端。Broker. 一台Kafka服务器就是一个Broker。一个集群由多个Broker组成。一个Broker可以容纳多个Topic。Topic. 可以理解为一个队列&#xff0c;一…

Oracle 如何给大表添加带有默认值的字段

一、讲故事 你是否遇到过开发人员添加字段&#xff0c;导致数据库锁表问题&#xff1f; 但是令开发疑惑的事&#xff0c;他们添加字段&#xff0c;有的时候很快&#xff0c;有的时候很慢&#xff1f; 为什么呢&#xff1f; 询问得知&#xff0c;**加的慢时候是带上了default默…

【洛谷】P2440 木材加工

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2440 1. 题目描述 2. 思路分析 整体思路&#xff1a;二分答案 设置一个变量longest来记录最长木头的长度&#xff0c;sum记录切成的小段数量之和。 令左边界l0&#xff0c;右边界llongest。 写一个bool类型的check…

【云原生】Docker的数据管理(数据卷、容器互联)

目录 一、数据卷&#xff08;容器与宿主机之间数据共享&#xff09; 二、数据卷容器&#xff08;容器与容器之间数据共享&#xff09; 三、 容器互联&#xff08;使用centos镜像&#xff09; 总结 用户在使用Docker的过程中&#xff0c;往往需要能查看容器内应用产生的数据…

联合注入步骤

使用场景&#xff1a; 有回显&#xff0c;可以看到某些字段的回显信息 像下面的有具体的回显信息 一、判断注入位点 在原始的id&#xff08;参数&#xff09;的输入后面添加额外的条件 如果and 11 有结果&#xff0c;and10没有结果输出&#xff0c; 就说明我们添加的额外条件…

2023最新AI创作系统ChatGPT网站源码V2.6.0+详细图文搭建安装教程/GPT联网/支持ai绘画+Dall-E2绘画/支持MJ以图生图

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01; SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 程序核心功能 程序已支持ChatGPT3.5/4.0提问、AI绘画、Midjourney绘画&#xff08;…

solidity0.8.0的应用案例12:通用可升级合约UUPS

代理合约中选择器冲突(Selector Clash)的另一个解决办法:通用可升级代理(UUPS,universal upgradeable proxy standard)。代码由OpenZeppelin的UUPSUpgradeable简化而成,不应用于生产。 UUPS 作为透明代理的替代方案,UUPS也能解决"选择器冲突"(Selector Cl…

论文阅读_模型结构_LoRA

name_en: LoRA: Low-Rank Adaptation of Large Language Models name_ch: LORA&#xff1a;大语言模型的低阶自适应 paper_addr: http://arxiv.org/abs/2106.09685 date_read: 2023-08-17 date_publish: 2021-10-16 tags: [‘深度学习’,‘大模型’] author: Edward J. Hu cita…