tnblog
首页
视频
资源
登录

Elasticsearch 倒排索引(运用Analyzer进行分词)

8820人阅读 2020/8/29 21:28 总访问:3659820 评论:0 收藏:1 手机
分类: 云产品

elasticsearch

Elasticsearch 倒排索引


正排与倒排索引

我们以一本书为例子,一本书的目录为正排索引,它将排列整本书的主要大纲。而倒排索引就像一些书的附页一样,上面记录着大量与本书相关的关键词。在搜索引擎当中,正排索引是从文档id,文档内容,单词的关联;倒排索引则是单词到文档id的关联。

倒排索引的核心索引

  • 倒排索引包含两个部分
    • 单词字典(Term Dictionary),记录所有文档的单词,记录单词到倒排索引的关联关系
      • 单词字典比较大,可以通过 B+ 树或哈希拉链法的实现,以满足高性能的插入或查询
    • 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成
      • 倒排索引项(Posting)
        • 文档ID
        • 词频 TF - 该单词在文档中出现的次数,用于相关性评分
        • 位置(Position)- 单词在文档中分词的位置。用于语句搜索(phrase query)
        • 偏移(Offset)- 记录单词的开始结束位置,实现高亮显示。

举一个简单的例子

例子

当我们从文档内容中去搜索Elasticsearch时候,右边就是倒排索引显示的结果。

Elasticsearch 的倒排索引

  • Elasticsearch 的JSON文档中的每个字段,都有自己的倒排索引。
  • 可以指定某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

Analysis 与 Analyzer

  • Analysis - 文本分析是把全文本转换为一系列单词(term、token)的过程,也叫分词
  • Analysis 是通过 Analyzer 来实现的
    • 可以使用 Elasticsearch 内置的分析器 / 或者按需定制化分析器
  • 除了在数据写入时转换词条,匹配 Query 语句的时候也需要用相同的分析器对查询语句进行分析

从上图我们可以看见,Elasticsearch Server被分成elasticsearchserver,表明上看通过空格的方式进行的拆分,然后首字母进行小写。

Analyzer 的组成

  • 分词器是专门处理分词的组件,Analyzer 由三部分组成
    • Character Filters (针对原始文本处理,例如去除html) / Tokenizer(按照规则切分为单词)/ Token Filter(将切分的单词进行加工,小写,删除 stopwords,增加同义词)

Elasticsearch 的内置分词器

  • Standard Analyzer - 默认分词器,按词切分,小写处理
  • Simple Analyzer - 按照非字母切分(符号被过滤),小写处理
  • Stop Analyzer - 小写处理,停用词过滤(the,a,is)
  • Whitespace Analyzer - 按照空格切分,不转小写
  • Keyword Analyzer - 不分词,直接将输入当作输出
  • Patter Analyzer - 支持正则表达式,默认 \W+(非字符分割)
  • Language - 提供了30多种常见语言的分词器
  • Customer Analyzer 自定义分词器

使用 _analyzer API

  • 直接指定 Analyzer 进行测试
  • 指定索引的字段进行测试
  • 自定义分词进行测试

Standard Analyzer

默认分词器、按词切分、小写处理

  1. #standard
  2. GET _analyze
  3. {
  4. "analyzer": "standard",
  5. "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
  6. }

部分截图

Simple Analyzer

按照非字母切分,非字母的都被去除;小写处理

  1. #simpe
  2. GET _analyze
  3. {
  4. "analyzer": "simple",
  5. "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
  6. }

Whitespace Analyzer

按照空格切分

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

Stop Analyzer

Stop Analyzer

相比 Simple Analyzer 多了stop filter(会把 the、a、is 等修饰性词语去除)

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

Keyword Analyzer

不分词,直接将输入当一个term输出

  1. #keyword
  2. GET _analyze
  3. {
  4. "analyzer": "keyword",
  5. "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
  6. }

Pattern Analyzer

通过正则表达式进行分词;默认是\W+,非字符当符号进行分割

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

Language Analyzer


通过语言的方式进行分割。(这里用英语的方式)

  1. #english
  2. GET _analyze
  3. {
  4. "analyzer": "english",
  5. "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
  6. }

中文分词(ICU Analyzer与其他)


中文分词难点在于不应该拆分成一个个字

  • 需要安装
    • Elasticsearch-plugin install analysis-icu
  • 提供了 Unicode 的支持,更好的支持亚洲语言
  1. POST _analyze
  2. {
  3. "analyzer": "icu_analyzer",
  4. "text": "他说的确实在理”"
  5. }

更多的中文分词器


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Elasticsearch 安装与部署

Elasticsearch 安装与部署[TOC] 环境准备 Java 8.0以上的环境本机环境为Mac,Java 14.0.2 获取 Elasticsearch 安装包 ...

Docker运行 Elasticsearch Kibana和Cerebro

Docker运行 Elasticsearch Kibana和Cerebro[TOC] Demo 运行 Docker-compose,本地构建更高效的开发环境,更直观地了解 El...

Elasticsearch 基本概念:索引、文档和REST API

Elasticsearch 基本概念:索引、文档和REST API[TOC] 前言 为了了解 Elasticsearch 如何构成,我们首先需要理解索引(I...

Elasticsearch 基本概念:节点、集群、分片及副本

Elasticsearch 基本概念:节点、集群、分片及副本[TOC] 分布式系统的可用性与扩展性 高可用性 服务可用性 - 允许有节...

Elasticsearch 文档的基本CRUD与批量操作

Elasticsearch 文档的基本CRUD与批量操作[TOC] 文档的 CRUD Index PUT my_index/_doc/1 {“user”:...

Elasticsearch Search API概览

Elasticsearch Search API概览[TOC] Search API 通过搜索获取的数据方式有两种。 URL Search 在URL中使用查询参数...

Elasticsearch URL Search详解

Elasticsearch URL Search详解[TOC] 通过 URL Query 实现搜索举例: Get /movies/_search?q=2020&df=title&sort...

Elasticsearch Request Body与Query DSL简介

Elasticsearch Request Body与Query DSL简介[TOC] Request Body Search 将查询语句通过 HTTP Resquest Body 发送给 Ela...

Elasticsearch 显式Mapping设置与常见参数介绍

Elasticsearch 显式Mapping设置与常见参数介绍[TOC] 如何显示的定义一个MappingPut movies { "mappings" ...

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer

Elasticsearch 多字段特性及Mapping中配置自定义Analyzer[TOC] 多字段类型多字段特性 厂家名字可以实现精确匹配,增加一...

Elasticsearch Index Template 和 Dynamic Template

Elasticsearch Index Template和Dynamic Template[TOC] 什么是 Index Template 可以通过一定的规则去设定 Mappings 和 Se...

Elasticsearch 聚合分析简介

Elasticsearch 聚合分析简介[TOC] 什么是聚合(Aggregation) 聚合:对有关的数据进行内容挑选、分析、归类(筛选),最...

Elasticsearch 基于词项和基于全文的搜索

Elasticsearch 基于词项和基于全文的搜索[TOC] 基于 Term 的查询Term 的重要性Term 是表达语意的最小单位。搜索和利用语言...

.NET Core使用Elasticsearch 一:windows安装Elasticsearch与kibana

一:安装java环境ElasticSearch是基于Java的所以先要安装Java,dkj,当然下载的ElasticSearch也带得也jkd也可以使用那个。下...

.NET Core使用Elasticsearch 二:CORE操作ES基础环境与简单查询

Elasticsearch使用版本7.12.0安装Elasticsearch与kibana可以参考:https://www.tnblog.net/aojiancc2/article/details/5875...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术