首页 > 其他分享 >Elastic学习之旅 (5) 倒排索引和Analyzer分词

Elastic学习之旅 (5) 倒排索引和Analyzer分词

时间:2024-03-02 19:22:29浏览次数:28  
标签:end 倒排 Elastic Analyzer 索引 token offset type

大家好,我是Edison。

上一篇:ES文档的CRUD操作

重要概念1:倒排索引

在学习ES时,倒排索引是一个非常重要的概念。要了解倒排索引,就得先知道什么是正排索引。举个简单的例子,书籍的目录页(从章节名称快速知道页码)其实就是一个典型的正排索引。

而一般书籍的末尾部分的索引页,则是一个典型的倒排索引,是从关键词 到 章节名称 / 页码。

由上可知,对于图书来讲:目录页就是正排索引,索引页就是倒排索引。

而对于搜索引擎来讲:文档ID到文档内容和单词的关联是正排索引,而单词到文档ID的关系则是倒排索引

我们可以从下面的两个表格来感受下正排索引和倒排索引的区别:

倒排索引的核心内容

倒排索引包含两个部分:

  • 单词词典(Term Dictionary):记录所有文档的单词,记录单词到倒排列表的关联关系。单词词典一般都很大,一般都通过B+树 或 哈希拉链法 实现,以满足高性能的插入和查询。

  • 倒排列表(Posting List):记录了单词对应的文档结合,由倒排索引项组成。倒排索引项(Posting)包括 文档ID、词频(TF,该单词在文档中出现的次数,用于相关性评分)、位置(Postion,单词在文档中分词的位置,用于语句搜索) 以及 偏移(Offset,记录单词的开始结束为止,实现高亮显示)

下图展示了ES中的一个例子:

ES中的JSON文档中的每个字段,都有自己的倒排索引。当然,我们可以指定对某些字段不做索引,以节省存储空间,但是这些字段就无法被搜索。

重要概念2:Analyzer

在ES中文本分析是其最常见的功能之一,文本分析(Analysis)是把全文转换为一系列单词(term)的过程,也叫作分词。

文本分析是通过Analyzer来实现,我们可以使用ES内置的分析器,也可以按需定制分析器

除了在数据写入时会进行全文转换词条,在匹配Query语句时也需要用相同的分析器对查询语句进行分析。

ES中的内置分词器

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

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

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

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

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

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

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

  • Custom Analyzer - 自定义分词器

通过Analyzer进行分词

这里,我们来用_analyzer API做一些demo:

(1)Standard Analyzer

GET /_analyze
{
  "analyzer": "standard",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:按词切分,默认小写(Quick被转成了quick)

{
  "tokens" : [
    {
      "token" : "2",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<NUM>",
      "position" : 0
    },
    {
      "token" : "running",
      "start_offset" : 2,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "quick",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "<ALPHANUM>",
      "position" : 2
    },
    {
      "token" : "brown",
      "start_offset" : 16,
      "end_offset" : 21,
      "type" : "<ALPHANUM>",
      "position" : 3
    },
    {
      "token" : "foxes",
      "start_offset" : 22,
      "end_offset" : 27,
      "type" : "<ALPHANUM>",
      "position" : 4
    },
    {
      "token" : "leap",
      "start_offset" : 28,
      "end_offset" : 32,
      "type" : "<ALPHANUM>",
      "position" : 5
    },
    {
      "token" : "over",
      "start_offset" : 33,
      "end_offset" : 37,
      "type" : "<ALPHANUM>",
      "position" : 6
    },
    {
      "token" : "lazy",
      "start_offset" : 38,
      "end_offset" : 42,
      "type" : "<ALPHANUM>",
      "position" : 7
    },
    {
      "token" : "dogs",
      "start_offset" : 43,
      "end_offset" : 47,
      "type" : "<ALPHANUM>",
      "position" : 8
    },
    {
      "token" : "in",
      "start_offset" : 48,
      "end_offset" : 50,
      "type" : "<ALPHANUM>",
      "position" : 9
    },
    {
      "token" : "the",
      "start_offset" : 51,
      "end_offset" : 54,
      "type" : "<ALPHANUM>",
      "position" : 10
    },
    {
      "token" : "summer",
      "start_offset" : 55,
      "end_offset" : 61,
      "type" : "<ALPHANUM>",
      "position" : 11
    },
    {
      "token" : "evening",
      "start_offset" : 62,
      "end_offset" : 69,
      "type" : "<ALPHANUM>",
      "position" : 12
    }
  ]
}

(2)Simple Analyzer

GET /_analyze
{
  "analyzer": "simple",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:非字母切分,忽略了数字2,小写处理

{
  "tokens" : [
    {
      "token" : "running",
      "start_offset" : 2,
      "end_offset" : 9,
      "type" : "word",
      "position" : 0
    },
    ......
  ]
}

(3)Whitespace Analyzer

GET /_analyze
{
  "analyzer": "whitespace",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:按照空格切分,不转小写。可以看到,brown-foxes被看成是一个整体,并未像其他分词一样分为brown 和 foxes。此外,也不会强制换位小写,比如Quick就保留了大写。

{
  "tokens" : [
    ......
    {
      "token" : "Quick",
      "start_offset" : 10,
      "end_offset" : 15,
      "type" : "word",
      "position" : 2
    },
    {
      "token" : "brown-foxes",
      "start_offset" : 16,
      "end_offset" : 27,
      "type" : "word",
      "position" : 3
    },
    ......
  ]
}

(4)Stop Analyzer

GET /_analyze
{
  "analyzer": "stop",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:小写处理,停用词过滤(the, a, is),这里原文中的in, over, the都被过滤掉了。

(5)Keyword Analyzer

GET /_analyze
{
  "analyzer": "keyword",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:不做任何分词处理,而是将输入整体作为一个term。通常用于不需要对输入做分词的场景。

{
  "tokens" : [
    {
      "token" : "2 running Quick brown-foxes leap over lazy dogs in the summer evening.",
      "start_offset" : 0,
      "end_offset" : 70,
      "type" : "word",
      "position" : 0
    }
  ]
}

(6)Pattern Analyzer

GET /_analyze
{
  "analyzer": "pattern",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

正则表达式,默认 \W+(非字符分隔)

新增一个表达式analyzer:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "\\W|_",  
          "lowercase": true
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_email_analyzer",
  "text": "[email protected]"
}

(7)Lanuage Analyzer

ES提供了多种语言的分词器:阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、捷克语、丹麦语、荷兰语、英语、芬兰语、法语、加利西亚语、德语、希腊语、印地语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、拉脱维亚语、立陶宛语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、索拉尼语、西班牙语、瑞典语、土耳其语、泰国语。

这里我们看看English:

GET /_analyze
{
  "analyzer": "english",
  "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}

分词结果:将running替换为了run,将foxes替换为fox,dogs替换为dog,evening替换为了even,in被忽略。

可以看到,ES支持的语言分词器中,没有支持中文,这是因为:中文分词存在较大的难点,不像英语那么简单。

不过,我们可以安装一些中文分词器的插件(plugin),比如ICU Analyzer, 它提供了unicode的支持,更好地支持亚洲语言。

elasticsearch-plugin install analysis-icu

ICU Analyzer的示例:

POST /_analyze
{
  "analyzer": "icu_analyzer",
  "text": "他说的确实在理"
}

分词结果:

[他,说的,确实,在,理]

小结

本篇,我们了解了ElasticSearch的另一个重要概念:倒排索引 和 一个重要工具:Analyzer,还通过一些demo了解了Analyzer的具体使用案例,它们帮助ElasticSearch实现了强大的搜索功能。

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

 

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

标签:end,倒排,Elastic,Analyzer,索引,token,offset,type
From: https://www.cnblogs.com/edisonchou/p/-/edc_elastic_study_notes_chap05

相关文章

  • Linux 环境下搭建 ElasticSearch
    centos8环境下搭建ElasticSearch7.8一、安装:复制下载链接地址,并使用wget命令下载对应的压缩包。例如:wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz下载完成后,解压压缩包:tar-xzvfelasticsearch-7.8.0-linux-x86......
  • Elasticsearch 系列(三)- ES的基本操作
    本章将和大家分享Elasticsearch的一些基本操作。话不多说,下面我们直接进入主题。一、索引库操作1、settings属性settings属性可以设置索引库的一些配置信息,例如:配置分片数和副本数、配置自定义分词器等。其中分片数量只能在一开始创建索引库的时候指定,后期不能修改。副本数......
  • elasticsearch开启慢查询
    环境:OS:Centos7ES:6.8.5 1.查看索引的设置curl-uelastic:123456-XGET"http://192.168.1.69:19200/hospital_info_demo3/_settings?pretty" 2.搜索部分设置query和fetch慢查询curl-uelastic:123456-XPUT"http://192.168.1.69:19200/hospital_info_demo3/_setting......
  • Elastic学习之旅(4)ES文档CRUD操作
    大家好,我是Edison。上一篇:ES必备基础概念一览ES文档CRUD介绍和MongoDB一样,文档的CRUD是我们学习ES的必备操作,下图展示了ES文档的CRUD概要:从上图可以知道,ES文档除了CRUD外,还多了一个Index操作,它的功能Create类似,但又有点不同:Create-如果ID存在,则会失败;否则新增成功;Ind......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer 题解
    蒟蒻的第一篇紫题题解!题目传送门思路一眼模拟,还是大模拟。不由得想起了我编了\(4\)个小时的猪国杀……输入首先处理输入,这里我们用一个字符串数组来存储所有的输入,然后再进行处理。while(getline(cin,sr))str[++cnt]=sr+'\n';处理时需要双重循环,注意如果遍历到空格要跳......
  • R语言弹性网络Elastic Net正则化惩罚回归模型交叉验证可视化
    原文链接:http://tecdat.cn/?p=26158原文出处:拓端数据部落公众号 弹性网络正则化同时应用L1范数和L2范数正则化来惩罚回归模型中的系数。为了在R中应用弹性网络正则化。在 LASSO回归中,我们为alpha参数设置一个'1'值,并且在岭回归中,我们将'0'值设置为其alpha参数......
  • ElasticSearch集群搭建
    1环境和版本1.1操作系统干干静静的centos7系统,选取的是mini的iso最小化安装CentOSLinuxrelease7.9.2009(Core)1.2ElasticSearch版本本文使用的版本是8.11.3,下载地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html1.3......
  • docker-compose 安装部署ElasticSearch 和 Kibana 8.8.1
    docker-compose安装部署ElasticSearch和Kibana8.8.1一、容器编排脚本(docker-compose.yml)version:"3.1"#服务配置services:elasticsearch:container_name:elasticsearch-8.8.1image:docker.elastic.co/elasticsearch/elasticsearch:8.8.1#用来给容......
  • Elasticsearch数据同步优化
    Elasticsearch数据同步优化背景为了满足项目需求,需要将大量数据的数据写入到ES进行检索,预估数据量是40亿左右,目前需要同步进去的是2亿左右。ES集群配置三台128G的国产服务器国产linux系统CPU主频低的拉跨JDK8的版本机械硬盘遇到的问题后端使用Java调用es的bulkapi......
  • Elasticsearch
    1,Elasticsearch简介1)分布式实时文件存储,可以将每一个字段都编入索引,使其可以被检索2)可以作为一个大型分布式集群(数百台服务器)技术,处理PB级数据3)Elasticsearch不是什么新技术,主要是将全文检索、数据分析以及分布式技术,合并在了一起,才形成了独一无二的ES2,基本概念1)Node(节点):Ela......