ElasticSearch核心知识讲解(一)

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: ElasticSearch核心知识讲解

倒排索引

倒排索引作为ES的核心,底层基于Lucene进行实现。

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过文档ID找单词,类似于书的目录结构。反向索引则是通过单词找文档ID,类似于字典查词,首先必须知道单词的全拼,然后通过字典的索引页再去查找单词的详情。

640.png

倒排索引建立流程

  • 内容爬取,停顿词过滤,比如一些无用的像"的",“了”之类的语气词/连接词
  • 内容分词,提取关键词。一段文本经过分词器分词后转换成多个Term关键词。
  • 根据关键词建立倒排索引。倒排索引包括Term Index(单词索引),Term Dictionary(单词字典),Posting List(倒排列表)
    用户输入关键词进行搜索。
    640.png

倒排索引具体组成

640.jpg

单词词典(Term Dictionary): 包含了所有数据在进行分词之后生成的单词(term),词典是由所有term构成的字符串集合。搜索引擎的通常索引单位是term,词典内每条索引项记载term本身的一些信息以及指向“倒排列表”的指针。ES 为了能快速查找到 term,将所有的 term 排了一个序,并采用二分法进行查找。


倒排列表(PostingList): 倒排列表记载了出现过某个单词的所有文档的文档列表记录,每条记录称为一个倒排索引项(Posting),其主要包括:

  • 文档ID,用于获取原始信息
  • 单词频率TF,记录该单词在该文档中的出现次数,用于后续相关性算分
  • 位置Position,记录单词在文档中分词的位置,用于语句搜索(phrase query)
  • 偏移Offset,记录单词在文档的开始和结束位置,实现高亮显示

根据倒排列表,即可获知某个单词在哪些文章中出现过。

单词索引(Term Index): ES 默认会对全部 text 字段进行分词并建立索引,导致Term Dictionary过大,无法存储在内存中。为了更快的找到某个Term,我们为单词建立索引。Term Index采用字典树结构,这棵树不会包含所有的 term,它包含的是 term 的一些前缀,通过 term index 可以快速地定位到 term dictionary 的某个 offset,然后从这个位置再往后顺序查找。就如上图所表示的。单词索引文件是为了加快对词典文件中词的查找速度,存储在内存中。

lucene 在这里还做了两点优化,一是 term dictionary 在磁盘上面是分 block 保存的,一个 block 内部利用公共前缀压缩,比如都是 Ab 开头的单词就可以把 Ab 省去。

二是 term index 在内存中是以 FST(finite state transducers)的数据结构保存的。

分词

在构建倒排索引的过程中,需要对文档内容进行分词,掌握分词要先懂两个名词:Analysis与Analyzer。

Analysis(文本分析)

即文本分析,是把全文本转化为一系列单词(term/token)的过程,也叫分词;Analysis是通过analyzer(分词器)来实现的,可以使用Elasticearch内置的分词器,也可以自己去定制一些分词器。

Analyzer(分词器)

由三部分组成

  1. Character Filters:原始文本处理
    首先,字符串按顺序通过每个字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。
    Tokenizer:按照规则切分为单词
    字符串被分词器按照规则分为单个的单词。一个 whitespace的分词器遇到空格和标点的时候,可能会将文本拆分成词条。下图为ES分词器汇总
    640.png
  2. Token Filters:字段过滤器,对切分单词加工、小写、删除 stopwords,增加同义词
    词条按顺序通过每个字段过滤器 。这个过程可能会改变词条,例如,lowercase token filter  小写化(将ES转为es)、stop token filter 删除词条(例如, 像 a, and, the 等无用词),或者synonym token filter 增加词条(例如,像 jump 和 leap 这种同义词)。

分词测试

使用index中的具体字段的分词器进行测试

下面的案例就是使用了index_name中的my_test字段所用的分词器进行测试。

GET ip:port/index_name/_analyze
{
  "field": "my_text",
  "text": "关注我,学习ES"
}

测试结果如下,从结果我们可以推测my_text字段使用的是standard分词器,按照每个词进行切分,且做小写处理。

{
    "tokens": [当前字段切分后出现的分词列表,由该词的文本、偏移量(开始和结束)、位置、以及类型组成;
        {
            "token": "关",//分词后的具体文本
            "start_offset": 0,//起始位置
            "end_offset": 1,//结束位置
            "type": "<IDEOGRAPHIC>",//当前单词的类型
            "position": 0//当前单词所在整个字段的位置。
        },
        {
            "token": "注",
            "start_offset": 1,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "我",
            "start_offset": 2,
            "end_offset": 3,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "学",
            "start_offset": 4,
            "end_offset": 5,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        },
        {
            "token": "习",
            "start_offset": 5,
            "end_offset": 6,
            "type": "<IDEOGRAPHIC>",
            "position": 4
        },
        {
            "token": "es",
            "start_offset": 6,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 5
        }
    ]
}

也可以直接使用analyzer

POST ip:port/_analyze
{
  "analyzer": "whitespace",//这里使用空格分词器
  "text":"关注我 学习ES"
}

可以看到,空格分词器直接采用空格进行切分,并不会对文中英文字母进行小写处理。

{
    "tokens": [
        {
            "token": "关注我",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0
        },
        {
            "token": "学习ES",
            "start_offset": 4,
            "end_offset": 8,
            "type": "word",
            "position": 1
        }
    ]
}

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

mapping

ES中的mapping映射可以把它类比于数据库中的表结构定义 schema,它有以下几个作用:

  • 定义索引中的字段的名称
  • 定义字段的数据类型,比如字符串、数字、布尔
  • 定义字段,倒排索引的相关配置,比如设置某个字段的分词器,是否可索引、记录 position 等

字段数据类型

字段的数据类型由字段的type属性指定,ES 字段类型主要有:核心类型、复杂类型、地理类型以及特殊类型,具体的数据类型如下图所示:

640.png

核心类型

从图中可以看出核心类型可以划分为字符串类型、数字类型、日期类型、布尔类型、基于 BASE64 的二进制类型、范围类型。

字符串类型

ES7.x有两种字符串类型:text和keyword,ES 5.x之后不再支持string 类型。

text 类型适用于需要被全文检索的字段,例如新闻正文、邮件内容等比较长的文字,text 类型会被分词器处理为一个个关键词后分别进行索引,支持模糊、精确查询,不支持聚合、排序操作。

keyword 与text不同,字段设置为此类型后,将不会进行分词操作直接索引。适合简短、结构化的字符串,可以用于过滤、排序、聚合检索,也可以用于精确查询。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
存储 关系型数据库 MySQL
MYSQL 单表可以放多少数据是怎么计算出来的
MYSQL 单表可以放多少数据是怎么计算出来的
529 2
|
JavaScript Java 测试技术
『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium
『App自动化测试之Appium基础篇』| 从定义、原理、环境搭建、安装问题排查等深入了解Appium
5105 0
|
11月前
|
机器学习/深度学习 传感器 人工智能
AI视频监控系统在养老院中的技术实现
AI视频监控系统在养老院的应用,结合了计算机视觉、深度学习和传感器融合技术,实现了对老人体征、摔倒和异常行为的实时监控与分析。系统通过高清摄像头和算法模型,能够准确识别老人的动作和健康状况,并及时向护理人员发出警报,提高护理质量和安全性。
661 14
|
域名解析 缓存 网络协议
【域名解析DNS专栏】IPv6与DNS:兼容性挑战与解决方案
【5月更文挑战第29天】随着IPv6逐渐成为互联网主流,DNS面临兼容性挑战,包括解析机制差异、资源记录类型扩展和查询流程优化。为解决这些问题,可采取升级DNS系统以支持IPv6、部署双栈DNS服务和优化DNS缓存策略。通过这些措施,可确保IPv6环境下的域名解析顺利进行。
1281 1
|
8月前
|
人工智能 自然语言处理 搜索推荐
AI大模型:职业教育在探索中的新航标
随着AI技术迅猛发展,AI大模型正成为职业教育变革的重要驱动力。职业院校积极探索AI大模型在教学中的应用,如广东科学技术职业学院的“知行大先生”大模型,助力助学、助教、助训、助管。然而,当前仍面临理解表面化、低水平重复等挑战。为解决这些问题,需紧贴行业需求,加强教师培训,并通过GAI认证提升个人AI应用能力,推动职业教育高质量发展。未来,期待更多AI大模型融入教学,培养适应社会需求的高端技术技能人才。
|
测试技术 API 开发工具
ElasticSearch核心概念:倒排索引
ElasticSearch核心概念:倒排索引
193 6
|
设计模式 算法 网络协议
社招offer-腾讯T9-70W年薪(面试经验分享)(上)
社招offer-腾讯T9-70W年薪(面试经验分享)
|
存储 自然语言处理 算法
倒排索引:ES倒排索引底层原理及FST算法的实现过程(一)
倒排索引:ES倒排索引底层原理及FST算法的实现过程
倒排索引:ES倒排索引底层原理及FST算法的实现过程(一)
|
消息中间件 数据可视化 Kafka
kafka可视化工具
kafka可视化工具
952 0
下一篇
oss云网关配置