Springboot2.x整合ElasticSearch7.x实战(二)

王仕宇编程
• 阅读 22

本教程是系列教程,对于初学者可以对 ES 有一个整体认识和实践实战。

还没开始的同学,建议先读一下系列攻略目录:Springboot2.x整合ElasticSearch7.x实战目录

本篇幅是继上一篇 Springboot2.x整合ElasticSearch7.x实战(一) ,适合初学 Elasticsearch 的小白,可以跟着整个教程做一个练习。

第三章 分词器安装

使用搜索,少不了使用分词器,elasticsearch 自带了一些简单分词器,也可以使用第三方分词器插件,如 ik、pinyin 等。

Standard Analyzer - 默认分词器,按词切分,小写处理

Simple Analyzer - 按照非字母切分(符号被过滤), 小写处理

Stop Analyzer - 小写处理,停用词过滤(the,a,is)

Whitespace Analyzer - 按照空格切分,不转小写

Keyword Analyzer - 不分词,直接将输入当作输出

Patter Analyzer - 正则表达式,默认\W+(非字符分割)

Language - 提供了30多种常见语言的分词器

Customer Analyzer 自定义分词器

ik分词器插件安装

  1. 下载和elasticsearch版本一致

教程使用的是 7.7.0 版本。

  1. 准备 ik 目录,

cd plugins && mkdir ik

  1. 下载

    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip 有些地方从github下载网络不好,我在课件里有插件压缩包。

  2. 解压到对应ik目录

解压文件到目录 elasticsearch-7.7.0/plugins/ik 下。

  1. 重启es,查看是否安装成功

curl http://localhost:9200/_cat/plugins

rest 实例:

拼音分词器插件安装

  1. 下载和elasticsearch版本一致

教程使用的是 7.7.0 版本。

  1. 准备 ik 目录,

cd plugins && mkdir pinyin

  1. 下载

    wget https://github.com/medcl/elasticsearch-analysis-pinyin/archive/v7.7.0.zip 有些地方从github下载网络不好,我在课件放了插件的压缩包。

  2. 解压到对应pinyin目录

解压文件到目录 elasticsearch-7.7.0/plugins/pinyin 下。

  1. 重启es,查看是否安装成功

curl http://localhost:9200/_cat/plugins

Springboot2.x整合ElasticSearch7.x实战(二)

更多扩展词库

  • 同义词词库

https://github.com/ginobefun/elasticsearch-dynamic-synonym/releases

有些情况会使用我们自己的分词服务,后面代码中会讲解使用方式。

第四章 Elasticsearch核心概念

Elasticsearch核心概念-相关术语解析

Cluster

Elasticsearch 集群,由一台或多台的Elasticsearch 节点(Node)组成。

Node

Elasticsearch 节点,可以认为是Elasticsearch的服务进程,在同一台机器上启动两个Elasticsearch实例(进程),就是两个node节点。

Index

索引,具有相同结构的文档的集合,类似于关系型数据库的数据库实例(6.0.0版本type废弃后,索引的概念下降到等同于数据库表的级别)。一个集群中可以有多个索引。

Type

类型,在索引中内进行逻辑细分,在新版的Elasticsearch中已经废弃。

关于 type 废弃问题,如果你需要维护低版本 elasticsearch(在7.0.0、6.*、5.6版本变化较大),一定要阅读这篇官方英文文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html

Document

文档,Elasticsearch中的最小的数据存储单元,JSON数据格式,很多相同结构的文档组成索引。文档类似于关系型数据库中表内的一行记录。

举个例子,一篇新闻的文档数据。

news document
{
    "id":"1",
    "title":"China is a great country",
    "content":"I love China."
}

Shard

分片,单个索引切分成多个shard,分布在多台Node节点上存储。可以利用shard很好的横向扩展,以存储更多的数据,同时shard分布在多台node上,可以提升集群整体的吞吐量和性能。在创建索引的时候可以直接指定分片的数量即可,一旦指定就不能再修改了。

Replica

索引副本,完全拷贝shard的内容,一个shard可以有一个或者多个replica,replica就是shard的数据拷贝,以提高冗余。

replica承担三个任务:

  1. shard故障或者node宕机时,其中的一个replica可以升级成shard
  2. replica保证数据不丢失,保证高可用
  3. replica可以分担搜索请求,提高集群的吞吐和性能

shard 的全称叫 primary shard,replica 全称叫 replica shard,primary shard 数量在创建索引时指定,后期不能修改,replica shard 后期可以修改。默认每个索引的 primary shard 值为5,replica shard 值为1,含义是5个primary shard,5个 replica shard,共10个 shard。因此 Elasticsearch 最小的高可用配置是2台服务器。

Springboot2.x整合ElasticSearch7.x实战(二)

理解倒排索引

例如倒排索引等内容

倒排索引相关术语

倒排索引(Inverted Index)是整个搜索的核心,倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

单词词典(Lexicon):常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

概念关系:

Springboot2.x整合ElasticSearch7.x实战(二)

简单倒排索引实例

倒排索引从逻辑结构和基本思路上来讲非常简单。下面我们通过具体实例来进行说明,使得大家能够对倒排索引有一个宏观而直接的感受。

假设有五个文档:

Springboot2.x整合ElasticSearch7.x实战(二)

通过分词后,每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引。

Springboot2.x整合ElasticSearch7.x实战(二)

事实上,索引系统还可以记录除此之外的更多信息。下图是一个相对复杂些的倒排索引,与上图的基本索引系统比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。

Springboot2.x整合ElasticSearch7.x实战(二)

最后,实用的倒排索引还可以记载更多的信息,上图所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”(以及在倒排列表中记录单词在某个文档出现的位置信息。

“文档频率信息”代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是非常重要的一个因子。而单词在某个文档中出现的位置信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此,因为这个信息对于搜索系统来说并非必需的,位置信息只有在支持“短语查询”的时候才能够派上用场。

参考:https://blog.csdn.net/hguisu/article/details/7969757

Springboot2.x整合ElasticSearch7.x实战(二)

在看和分享是对我最大的鼓励,我是 pub 哥,我们下期再见

JavaPub 官网: http://javapub.net.cn/

《最少必要面试题》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
双十一预售活动分析
2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型
王仕宇编程
王仕宇编程
Lv1
男 · JavaPub · 软件工程师
代码编织梦想,科技成就未来。
文章
6
粉丝
0
获赞
0