ElasticSearch总结

ES是什么

ES是一个天生支持分布式的搜索、聚合分析的存储引擎
基于Java开发 基于Lucene的开源分布式搜索引擎

ELK : elasticSearch Logstah Kibana
加入 Beats 后
ELK 改为 :Elastic stack

ES解决了什么问题

ES解决的核心问题 : 1.海量数据 2.全文检索
ES不擅长的场景 : 管理数据、事务场景、大单页查询、数据实时写入更新

ES生产模式和开发模式

生产环境 :用于生产环境的运行模式,生产模式下要考虑高可用、故障转移、性能优化等安全因素 ,要求比较高
开发环境 :用于测试的运行环境、相对要求比较低

引导检查
单节点发现 :会将自己设置为主节点,不允许其他节点加入,会放弃一些检查

ES存储和索引

ES是面向文档存储的,索引 :相同类型的文档的集合

文档(document) :每条数据是一个文档
词条(term) : 文档按照语义分成词条

ES和MYSQL 对比

倒排索引

Mysql : 采用 正向索引 like 等内容检索 操作 会 逐行 扫描
Es采用倒排索引

查询过程 :
1 分词
2 根据词条去列表查询文档id
3 根据文档id查询文档
4 存入结果集

ES数据同步

ES 中的数据 来自于Mysql ,因为当mysql发生改变时,会涉及到数据同步问题
常见模型 : 读写分离 ,ES负责搜索和查询 ,Mysql只负责 数据写入和更新

1.同步双写数据同步

效率较低 ,业务耦合,不推荐

2.异步双写

使用 消息队列(mq)来异步实现数据同步,缺点:依赖mq的可靠性

3.监听binlog

使用中间件来监听 mysql 的binlog (如:canal)来完成数同步
可完全解除服务间耦合 。需要开启binlog

ES集群

海量数据存储问题 :将索引库 从逻辑上拆分为多个分片(shard),存储到多个节点
单点故障问题:将分片数据再不同节点备份

节点角色

脑裂问题

默认情况 :每个节点都是 master eligible (备选主节点)一旦 msater 宕机 ,当值 master 和某些节点连接不上
其他节点会选举一 个新的主节点 ,网络恢复会出现两个master节点 。 称为 :脑裂问题

ES处理: 选票超过 eligible节点数+1 / 2 ,才能当主, eligible 数量配置为 奇数
配置:discovery.zen.minimum_master_nodes es7.0之后,默认开启此配置

ES分布式存储

新增文档时:通过hash 算法来计算 文档应该存储到那个分片
对文档ID 进行哈希 ,对分片数量取余

索引库一旦创建,分片数量不能修改

ES分布式查询

Es查询分为两个阶段

  1. Scatter phase 分散阶段 ,协调节点把请求分发到每个分片
  2. Gather phase 聚集阶段 , 协调节点将 查询结果汇总 请返回给用户

故障转移

主节点故障 : eligible master 重新选举为主节点
数据节点故障 :主节点监控分片 :, 将故障节点的分片 转移到 其他健康的节点

索引库操作

ES的操作语法 称为 DSL :类似于sql

mapping映射属性

Mapping是对索引库中 文档的约束 ,常见的 mapping属性包括 :

Type :字符 类型 :字符串text(可分词)、keyword(不可分割)
数值 :long、int、short、byte、double float
布尔 :boolean
日期 :date
对象 :object
Index :是否创建 索引 默认 true

analyzer:使用哪种分词器

properties :该字段的子字段

创建索引库

ES 创建索引库和mapping的 DSL语法如下
在这里插入图片描述

查询、删除索引库

查看 : GET /索引库名称
删除: DELETE/索引库名称

修改索引库 :索引库和mapping禁止修改,因为修改会影响到 倒排索引和分词
但是可以 添加新的字段:

Put /索引库名称/_mapping
{
Xxx
}

文档操作

文档类似于 mysql中的 行

新增文档

post操作

查看、删除 文档

GET /索引库名/_doc/文档id

DELETE/索引库名/_doc/文档id

修改文档

**1.全量修改 :**删除旧文档,添加新文档
blog.csdnimg.cn/0d9a8da616aa4321918da2be370b4e8e.png)

2.局部修改。修改指定得字段值

DLS查询语法

查询类型 :

查询所有 :例 :match_all
全文检索 :利用分词器,去倒排索引查询匹配 例: match_query multi_match_query
精确查询 :根据keyword等完整词条查询,不需要查询分词内容 例: ids range term
地理查询 : geo_distanch geo_bounding_box
符合查询 :将以上方式组合使用 并且可以使用 与或非

DSL Query 基本语法

在这里插入图片描述

全文检索查询

利用分词器,去倒排索引查询匹配 例: match_query multi_match_query
常用于:搜索框

Match查询 :根据 关键字 分词,去倒排索引库中检索

multi_match :可以同时查询多个字段

精确查询

精确查询一般用于查找 keyword 数值、日期、bool 等 不可分词字段 、

Term 查询 :根据词条精确值 查询
Range 查询 :根据值的范围查询 gt 大于 gte大于等于 lt 小于 lte 小于等于
在这里插入图片描述

地理查询

根据经纬度查询

geo_bounding_box :查询 geo_point值落在某个矩形范围的所有文档
查询 Top_left 和bottom_right之间 的文档

geo_distance :查询到指定点为中心 距离小于某个值(distance)的所有文档

复合查询

在将其他简单查询结合起来,实现更复杂的搜索逻辑

Function score :算法函数查询,可以控制 文档 相关性算分 ,控制 文档排名

相关性算分 :搜索结果 与搜索词条关联打分(_score)

TF-IDF算法 : 频率 * 权重

BM25算法 : es 5.0之后
相比较 TF—IDF 得分 会更加平滑

Function score Query : 可以修改相关性算分 。根据新得到的算法排序
在这里插入图片描述

Boolean Query (与或非)

布尔查询是一个活多个查询子句的组合。 子查询组合方式有 :

must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或〞
must_not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分

搜索结果处理(排序、分页、高亮)

排序

对搜索结果进行排序 ,默认按照(_socre)来排序 可以排序的子字段有 :keyword 、数值、GEO、日期 等

分页

ES默认只返回TOP10的数据 。需要查询更多数据则需要修改分页参数
ES 通过 from size 来控制 分页

ES 由于 是倒排索引 所以分页需要查询出 前面所有的数据 比如 from 990 siez 10 则要 查出 1000 条数据 再截取 10条
问题 :ES是分布式的,会导致深度分页问题 ,找每个分片 的 前 1000数据 ,再合并 找出 前1000 。会对性能有很大影响
ES设定的 结果集上限是10000

深度分页解决方案
Search after : 分页时需要排序。从上一次排序位置开始查询下一页,缺点:只能向后翻页 。 官方推荐
Scroll :将排序数据形成快照 。保存在 内存 。 缺点 :耗内存,并且数据可能不是最新

高亮

将搜索结果中的关键字突出显式

原理 :
将关键字有标签标记出来 ,再页面中给标签添加css样式

highlight 高亮:

数据聚合

聚合可惜实现对文档数据的统计、分析、运算。 聚合常见有三类

桶聚合(bucket):用来对文档分组

TermAddregation:按文档字段值分组
Date histogram: 按日期阶梯分组

Size : 聚合结果数量
Order :结果排序方式
Field:指定聚合字段
Query可以先定聚合的范围(查询条件)

度量聚合(Metric):用来计算数值:最大值、最小值、平均值等

在brandAgg 内部使用 aggs 即可使用度量聚合

管道聚合(pipeline)

以其他聚合的结果再做聚合

自动补全

自定义分词器

elasticsearch中分词器 (analvzer)的组成包含三部分:

character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
**tokenizer:**将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik smart
**tokenizer filter:**將tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

我们在创建索引库时,通过settings来配置自定义的 analyzer(分词器)
在这里插入图片描述
如何使用拼音分词器?

  1. 下载pinyin分词器
  2. 解压并放到elasticsearch的plugin目录
  3. 重启即可
    如何自定义分词器?
    创建索引库时,在settings中配置,可以包含三部分
    character filter.
    tokenizer
    Afilter

completion suggester 自动补全

completion suggester 查询 实现了自动补全功能
此查询会匹配用户输入开头词条并返回

参与查询的字段 必须是:completion类型
字段内容一般是用来补全的多个词条形成的数组

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

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

相关文章

Vue2向Vue3过度核心技术工程化开发和脚手架

目录 1 工程化开发和脚手架1.1 开发Vue的两种方式1.2.脚手架Vue CLI 2 项目目录介绍和运行流程2.1 项目目录介绍2.2 运行流程 3 组件化开发4 根组件 App.vue4.1 根组件介绍4.2 组件是由三部分构成4.3 总结 5 普通组件的注册使用-局部注册5.1 特点:5.2 步骤&#xff…

爬虫异常处理之如何处理连接丢失和数据存储异常

在爬虫开发过程中,我们可能会遇到各种异常情况,如连接丢失、数据存储异常等。本文将介绍如何处理这些异常,并提供具体的解决代码。我们将以Python语言为例,使用requests库进行网络请求和sqlite3库进行数据存储。 1. 处理连接丢失 …

GD32-舵机的原理

GD32-舵机的原理 舵机的现一脉宽与舵机转动角度 旋转编码器的原理 顺时针:A的下降沿时,B处于高电平; 逆时针:A的下降沿时,B处于低电平; #ifndef _ENCODER_DRIVE_H #define _ENCODER_DRIVE_H#include &quo…

开源软件的崛起:历史与未来

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

5.Redis-string

string 字符串 字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意: 1.⾸先Redis中所有 key 的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如 list 和 set 的元素类型是字符串类型。 2…

每日一题 823. 带因子的二叉树

每日一题 823. 带因子的二叉树 难度:中等 思路: 取乘积,那么两个叶子节点相乘一定会得到一个更大的数,所以先排序以父节点为根节点的数的数量 以右节点为根节点的数的数量 * 以左节点为根节点的数的数量初始化列表,…

花5分钟判断,你的Jmeter技能是大佬还是小白!

jmeter 这个工具既可以做接口的功能测试,也可以做自动化测试,还可以做性能测试,其主要用途就是用于性能测试。但是,有些公司和个人,就想用 jmeter 来做接口自动化测试。 你有没有想过呢? 下面我就给大家讲…

多线程(二)

一.关于线程的常用操作 1.启动线程 run(): 对于run方法的覆写只是指定线程要做的任务清单,而不是真正的启动线程 start(): start()方法才是真正的在底层创建出一个线程,并且启动 2.中断线程 1.通过共享的标记来中断 package demo; impor…

unity-AI自动导航

unity-AI自动导航 给人物导航 一.地形创建 1.首先我们在Hierarchy面板中创建一个地形对象terrian,自行设定地形外貌,此时我们设置一个如下的地形外观。 二.创建导航系统 1.在主人公的Inspector、面板中添加Nav Mesh Agent (导航网格代理&…

python中的matplotlib画直方图(数据分析与可视化)

python中的matplotlib画直方图(数据分析与可视化) import numpy as np import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns",None) plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus]Fa…

【Linux】进程通信 — 信号(下篇)

文章目录 📖 前言1. 阻塞信号1.1 信号其他相关常见概念:1.2 sigset_t:1.2 - 1 信号集操作函数 1.3 sigprocmask:1.4 sigpending: 2. 进程处理信号2.1 内核页表和用户页表:2.2 内核态和用户态:2.…

「Vue|网页开发|前端开发」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转

本文主要介绍如何使用路由控制来实现将一个单页面网站扩展成多页面网站,包括页面扩展的逻辑,vue的官方路由vue-router的基本用法以及扩展用法 文章目录 本系列前文传送门一、场景说明二、基本的页面扩展页面扩展是在扩什么创建新页面的代码,…

面试题-React(七):React组件通信

在React开发中,组件通信是一个核心概念,它使得不同组件能够协同工作,实现更复杂的交互和数据传递。常见的组件通信方式:父传子和子传父 一、父传子通信方式 父组件向子组件传递数据是React中最常见的一种通信方式。这种方式适用…

SpringBoot异步方法支持注解@Async应用

SpringBoot异步方法支持注解Async应用 1.为什么需要异步方法? 合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 2.SpringBoot中的异步方法支持 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来…

C#_进程单例模式.秒懂Mutex

什么是Mutex? 可以定义调用线程是否具有互斥性,程序创建者拥有控制权,相反只能引用程序。 参数1:如果是程序创建者,就获得控制权。 参数2:名称,可使用GUID生成。 参数3:out 返回值&#xf…

Linux下套接字TCP实现网络通信

Linux下套接字TCP实现网络通信 文章目录 Linux下套接字TCP实现网络通信1.引言2.具体实现2.1接口介绍1.socket()2.bind()3.listen()4.accept()5.connect() 2.2 服务器端server.hpp2.3服务端server.cc2.4客户端client.cc 1.引言 ​ 套接字(Socket)是计算机网络中实现网络通信的一…

1688API技术解析,实现获得1688商品详情

要实现获得1688商品详情,你需要使用1688 API。1688 API是阿里巴巴旗下的开放平台,它提供了一套丰富的接口,可以让开发者通过编程的方式获取到1688网站上的商品信息。 首先,你需要在阿里开放平台注册一个账号,并创建一…

【NLP的python库(01/4) 】: NLTK

一、说明 NLTK是一个复杂的库。自 2009 年以来不断发展,它支持所有经典的 NLP 任务,从标记化、词干提取、词性标记,包括语义索引和依赖关系解析。它还具有一组丰富的附加功能,例如内置语料库,NLP任务的不同模型以及与S…

深眸科技创新赋能视觉应用产品,以AI+机器视觉解决行业应用难题

随着工业4.0时代的加速到来,我国工业领域对于机器视觉技术引导的工业自动化和智能化需求持续上涨,国内机器视觉行业进入快速发展黄金期,但需求广泛出现同时也对机器视觉产品的检测能力提出了更高的要求。 传统机器视觉由人工分析图像特征&am…

JAVA JNA 调用C接口的三种方式

文章目录 1. 准备一个共享库文件2. JNA姿势1—继承Library接口3. JNA姿势2—直接NativeLibrary.getInstance3. JNA姿势3—Native方法 1. 准备一个共享库文件 test.c #include <stdio.h> int test(char *input){printf("input:%s\n",input);return 0; }libtes…