07_ElasticSearch:倒排序索引与分词Analysis

news2024/11/16 11:26:08

07_ElasticSearch:倒排序索引与分词Analysis

  • 一、 倒排索引是什么?
    • 1.1 通过示例,简单理解下
    • 1.2 核心组成
  • 二、倒排索引是怎么工作的?
    • 2.1 创建倒排索引
    • 2.2 倒排索引搜索
  • 三、Analysis 进行分词
    • 3.1 Analyzer 由三部分组成
    • 3.2 Analyzer 分词过程简介
      • 1)字符过滤器 character filter
      • 2)分词器 tokenizer
      • 3)令牌过滤器token filter
    • 3.3 自定义分析器
    • 3.4 测试分词
    • 3.5 ik分词安装
      • ik_max_word:细颗粒度分词
      • ik_smart:粗颗粒度分词

一、 倒排索引是什么?

倒排索引是 Elasticsearch 中非常重要的索引结构,是从文档单词到文档 ID 的映射过程

1.1 通过示例,简单理解下

就拿专栏文章来说,我们平时在各大平台根据关键词检索时,使用到的技术就有“倒排序索引”。

ID作者文章标题内容
1author1系统学习es系统学习es, 倒排序索引
2author2学习mysqlmysql, 正排序索引

假设我们的文章的储存结果如上,对于关系型数据库mysql来说,普通的索引结构就是“id->题目->内容”,在我们搜索的时候,如果我们知道id或者题目,那么检索效率是很高效的,因为“id”、“题目”是很方便创建索引的。

索引内容
1系统学习es, 倒排序索引
系统学习es系统学习es, 倒排序索引
2mysql, 正排序索引
学习mysqlmysql, 正排序索引
         正排序索引如上表

但是当我们只有一个检索关键词,比如需求是搜索到与“倒排序索引”相关的文章时,在索引结构是“id->题目->内容”时,就只能对“题目”和“内容”进行全文扫描了,当数量级上去后,效率是没办法接受的!对于这类的搜索,关系型数据库的索引就很难应付了,适合使用全文搜索的倒排索引。

那么倒排序索引的结构是怎样的呢?简单来讲就是“以内容的关键词”建立索引,映射关系为“内容的关键词->ID”。这样的话,我们只需要在“关键词”中进行检索,效率肯定更快。

Token 元文档ID=1文档ID=2
系统1
学习11
es1
mysql1
倒排序1
正排序1
索引11
         倒排序索引如上表

1.2 核心组成

倒排序索引包含两个部分:

》单词词典:记录所有文档单词,记录单词到倒排列表的关联关系

》倒排列表:记录单词与对应文档结合,由倒排索引项组成

倒排索引项:

》文档

》词频 TF - 单词在文档中出现的次数,用于相关性评分

》位置(Position)- 单词在文档中分词的位置,用于phrase query

》偏移(Offset)- 记录单词开始结束的位置,实现高亮显示

二、倒排索引是怎么工作的?

主要包括2个过程:1、创建倒排索引;2、倒排索引搜索

2.1 创建倒排索引

还是使用上面的例子。先对文档的内容进行分词,形成一个个的 token,也就是 单词,然后保存这些 token 与文档的对应关系。结果如下:

Token 元文档ID=1文档ID=2
系统1
学习11
es1
mysql1
倒排序1
正排序1
索引11

2.2 倒排索引搜索

搜索示例1:“学习索引”

先分词,得到两个Token:“学习”、“索引”

然后去倒排索引中进行匹配

这2个Token在2个文档中都匹配,所以2个文档都会返回,而且分数相同。

搜索示例2:“学习es”

同样,2个文档都匹配,都会返回。但是文档1的相关性评分会高于文档2,因为文档1匹配了两个Token,而文档2只匹配了一个Token【学习】。

通过上面的讲解,我们学习了解了:倒排序索引是什么及其工作流程。其中有一个非常重要的环节——对文档进行分词,得到Token。那么这个分词过程,是怎样进行的呢?

三、Analysis 进行分词

一个tokenizer(分词器)接收一个字符流,将之分割为独立的tokens(词元,通常是独立
的单词),然后输出tokens流。
例如,whitespace tokenizer遇到空白字符时分割文本。它会将文本"Quick brown fox!"分割
为[Quick,brown,fox]]。
该tokenizer(分词器)还负责记录各个term(词条)的顺序或position位置(用于phrase短
语和word proximity词近邻查询),以及term(词条)所代表的原始word(单词)的start
(起始)和end(结束)的character offsets(字符偏移量)(用于高亮显示搜索的内容)。
Elasticsearch提供了很多内置的分词器,可以用来构建customanalyzers(自定义分词器)。

Analysis:即文本分析,是把全文本转化为一系列单词(term/token)的过程,也叫分词;在Elasticsearch 中可通过内置分词器实现分词,也可以按需定制分词器。

3.1 Analyzer 由三部分组成

• Character Filters:原始文本处理,如去除 html
• Tokenizer:按照规则切分为单词
• Token Filters:对切分单词加工、小写、删除 stopwords,增加同义词

3.2 Analyzer 分词过程简介

1)字符过滤器 character filter

首先,字符串按顺序通过每个字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。

2)分词器 tokenizer

其次,字符串被 分词器 分为单个的词条。一个 whitespace的分词器遇到空格和标点的时候,可能会将文本拆分成词条。

在这里插入图片描述

3)令牌过滤器token filter

最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条,例如,lowercase token filter 小写化(将ES转为es)、stop token filter 删除词条(例如, 像 a, and, the 等无用词),或者synonym token filter 增加词条(例如,像 jump 和 leap 这种同义词)。

3.3 自定义分析器

#1、定义名为“custom_analyzer”的自定义分析器:大写转为小写
PUT tehero_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
# 2、该字段my_text使用custom_analyzer分析器
  "mappings": {
    "_doc": {
      "properties": {
        "my_text": {
          "type": "text",
          "analyzer": "custom_analyzer"
        }
      }
    }
  }
}

3.4 测试分词

# 要引用此分析器,analyzeAPI必须指定索引名称。
# 直接使用分析器
GET tehero_index/_analyze 
{
  "analyzer": "custom_analyzer",
  "text":"关注我,间隔系统学ES"
}
# 通过字段使用
GET tehero_index/_analyze
{
  "field": "my_text",
  "text": "关注我,间隔系统学ES"
}

从analyzeAPI 的输出可以看出,分析器不仅将搜索词转换为Token,而且还记录 每个Token的顺序或相对位置(用于短语查询或单词接近性查询),以及每个Token的开始和结束字符偏移量原始文字中的字词(用于突出显示搜索摘要)。

3.5 ik分词安装

代码库
https://gitcode.net/mirrors/medcl/elasticsearch-analysis-ik

直接把下周压缩包放到es的安装目录 plugings下

Analyzer: ik_smart , ik_max_word , Tokenizer: ik_smart , ik_max_word

ik_max_word:细颗粒度分词

ik_max_word: 会将文本做最细粒度的拆分,比如会将“关注我系统学习ES”拆分为“关注,我,系统学,系统,学习,es”,会穷尽各种可能的组合,适合 Term Query;

ik_smart:粗颗粒度分词

ik_smart: 会做最粗粒度的拆分,比如会将“关注我系统学习ES”拆分为“关注,我,系统,学习,es”,适合 Phrase 查询。

建议:一般情况下,为了提高搜索的效果,需要这两种分词器配合使用。既建索引时用 ik_max_word 尽可能多的分词,而搜索时用 ik_smart 尽可能提高匹配准度,让用户的搜索尽可能的准确。比如一个常见的场景,就是搜索"进口红酒"的时候,尽可能的不要出现口红相关商品或者让口红不要排在前面。

在简单学习了解了Ik分词后,我们就可以去学习es的全文查询了。

POST /full_text_index/_analyze
{
  "analyzer": "ik_max_word",
  "text": "关注我,间隔系统学编程"
}

POST /full_text_index/_analyze
{
  "analyzer": "ik_smart",
  "text": "关注我,间隔系统学编程"
}

maxworkd 效果

{
  "tokens" : [
    {
      "token" : "关注",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "我",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "间隔",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "系统学",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "系统",
      "start_offset" : 6,
      "end_offset" : 8,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "学",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "CN_CHAR",
      "position" : 5
    },
    {
      "token" : "编程",
      "start_offset" : 9,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 6
    }
  ]
}

smart 效果

{
  "tokens" : [
    {
      "token" : "关注",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "我",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "CN_CHAR",
      "position" : 1
    },
    {
      "token" : "间隔",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "系统学",
      "start_offset" : 6,
      "end_offset" : 9,
      "type" : "CN_WORD",
      "position" : 3
    },
    {
      "token" : "编程",
      "start_offset" : 9,
      "end_offset" : 11,
      "type" : "CN_WORD",
      "position" : 4
    }
  ]
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARP协议-介于数据链路层和网络层之间的协议

通过上一篇 IP协议 我们知道 目标IP目标网络 目标主机 🙋‍ 也就是说 必须知道 接收方的接收方的 MAC地址 > 没有MAC地址无法封装 MAC帧 在网络层,我们可以知道目标主机的 IP 地址, 但是 我们不知道对方的MAC地址 。 在同一个网段&…

Win10安装Docker Desktop并运行Tutorial示例

背景 前段时间一个项目需要在开发环境直接使用 Docker ,为了省事便计划在本地安装 Desktop 版的 Docker 。其实安装过程比较简单,可视化安装即可,主要是对安装与初步使用时遇到的问题做个记录。 下载安装 下载地址:https://dow…

体验facechain

安装Anaconda 下载页面:https://www.anaconda.com/download/ Clone代码仓 git clone https://github.com/modelscope/facechain.git --depth 1 GIT_LFS_SKIP_SMUDGE1安装依赖 cd ./facechain pip install -r requirements.txt pip install -U openmim 运行 修改…

【C++代码】找树左下角的值,路径总和,从中序与后序遍历序列构造二叉树,从前序与中序遍历序列构造二叉树--代码随想录

题目:找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。假设二叉树中至少有一个节点。 题解 使用 height 记录遍历到的节点的高度,curVal 记录高度在 curHeight 的最左节点的值。在深度优先搜索时&a…

获取文件最后修改时间

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Java源码 public void testGetFileTime() {try {String string "E://test.txt";File file new File(string);Path path file.toPath();BasicFileAttributes ba…

第P6周—好莱坞明星识别(2)

五、模型训练 # 训练循环def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset) # 训练集的大小num_batches len(dataloader) # 批次数目train_loss, train_acc 0, 0 # 初始化训练损失和正确率for X, y in dataloader: # 获取图片及其标签X…

定制化精准推送与用户分组策略:数智营销的硬技能

对于移动应用开发者和运营者而言,推送是保持良好客户互动,实现用户裂变增长的重要方式,在实际推送服务设计中,往往会根据不同的需求和应用场景,针对性的选取特定对象发送特定内容的推送。具体而言,主流的智…

【C刷题】day3

一、选择题 1、已知函数的原型是: int fun(char b[10], int *a); ,设定义: char c[10];int d; ,正确的调用语句是( ) A: fun(c,&d); B: fun(c,d); C: fun(&c,&d); D: fun(&c,d); 【答案…

大模型应用发展的方向|代理 Agent 的兴起及其未来(下)

“ 借助LLM作为代理大脑的优势,探讨了单一代理、多代理系统和人机协作等应用场景,探讨了代理的社会行为、心理活动以及在模拟社会环境中观察新兴社会现象和人类洞见的可能性。” 01 — 造福人类:代理实践 LLM型智能代理是一种新兴的方向&…

【51单片机实验笔记】LED篇(二)多色LED的基本控制

目录 前言硬件介绍双色LED三色LED七彩自动闪烁LED 接线图面包板介绍直插电阻介绍色环解析 双色LED实际接线图三色LED实际接线图七彩自动闪烁LED实际接线图 软件实现双色LED交替闪烁三色LED灯交替闪烁 总结 前言 本节内容我们学习了解一些多色LED的显示原理及驱动方式。 本节涉…

Pytorch---空间特征金字塔SPP模块的实现

文章目录 一、SPP模块二、使用pytorch实现 一、SPP模块 SPP模块是指定空间特征金字塔模块,是由何凯明在2014年的论文中所提出的。 论文地址如下: 论文地址 该模块的主要作用是:在分类网络中,通过分类器之后,与全连接…

stack与queue的简单封装

前言: stack与queue即栈和队列,先进后出/先进先出的特性我们早已了然于心, 在学习数据结构时,我们利用c语言实现栈与队列,从结构体写起,利用数组或指针表示他们的数据成员,之后再一个个实现他们…

Linux 故障定位手段之保存某个时间段内的top结果

在Linux中对故障原因进行定位时,除了查看对应的软体运行日志、OS运行日之外,还可以查看 top 的资源消耗结果。 参考语句: 以CPU为基准列进行排序记录TOP结果 nohup top -d 1 -b -o %CPU | tee -a /tmp/cpu.txt & 语句含义:每…

etc目录下的profile.d文件目录设置环境变量和全局脚本

一、设置环境变量 etc目录下的profile.d文件目录 /etc/profile.d 1、编写 vi test.sh文件内容 # jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile …

34.CSS魔线图标的悬停效果

效果 源码 index.html <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Icon Fill Hover Effects</title> <link rel="stylesheet" h…

【深度学习实验】前馈神经网络(final):final

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;IrisDataset&#xff09; 2. 构建模型&#xff08;FeedForward&#xff09; a. __init__(初始化) b. forward(前向传播) 3.整合训练、评估…

Mojo:新型AI语言中的7个令人惊叹的Python升级,用简单的英语解释人工智能

Mojo&#xff1a;新型AI语言中的7个令人惊叹的Python升级 编程之美 用简单的英语解释人工智能 编程之美 由Coding Beauty设计的图像&#xff0c;使用Mojo标志和Python标志。 它比C更快&#xff0c;与Python一样简单&#xff0c;但速度提高了35000倍。 进入Mojo&#xff1a;一种…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

深度学习自学笔记四:浅层神经网络(一)

一、神经网络概述 神经网络是一种模仿人脑神经系统结构和功能的计算模型。它由大量相互连接的人工神经元组成&#xff0c;并通过这些神经元之间的信息传递来进行计算和学习。 神经网络的基本组成单元是神经元&#xff0c;也称为节点或单元。每个神经元接收来自其他神经元的输…

第一百五十二回 自定义组件综合实例:游戏摇杆三

文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…