一、倒排索引

1. 构建倒排索引

例如说有下面两个句子doc1,doc2

doc1:I really liked my small dogs, and I think my mom also liked them.
doc2:He never liked any dogs, so I hope that my mom will not expect me to liked him.

首先进行英文分词,这个阶段就是初步的倒排索引的建立

term doc1 doc2
I * *
really *
liked * *
my * *
small *
dogs *
and *
think *
mom * *
also *
them *
He *
never *
any *
so *
hope *
that *
will *
not *
expect *
me *
to *
him *

接下来就是搜索,假如说搜索为关键词为"mother like little dog",把关键词分词为mother like little dog四个词进行搜索,会发现搜不出来结果。这不是我们想要的结果。但是对于mom来说,它与mother互为同义词。在我们人类看来这两个词代表的意思就是一样。所以能想到的操作就是能不能让这两个词代表的含义一样呢?这就是对词语进行标准化操作了。

2. 重建倒排索引

normalization正规化,建立倒排索引的时候,会执行一个操作,也就是说对拆分出的各个单词进行相应的处理,以提升后面搜索的时候能够搜索到相关联的文档的概率。比如说时态的转换,单复数的转换,同义词的转换,大小写的转换等

mom ―> mother
liked ―> like
small ―> little
dogs ―> dog

重新建立倒排索引,加入normalization,重建后的倒排索引如下

word doc1 doc2 normalization
I * *
really *
like * * liked ―> like
my * *
little * small ―> little
dog * dogs ―> dog
and *
think *
mother * * mom ―> mother
also *
them *
He *
never *
any *
so *
hope *
that *
will *
not *
expect *
me *
to *
him *

3. 重新搜索

再次用mother liked little dog搜索,就可以搜索到了。对搜索条件经行分词 normalization

mother -》mom
liked -》like
little -》small
dog -》dogs

这样的话doc1和doc2都会搜索出来

二、分词器 analyzer

1. 什么是分词器 analyzer

作用:简单来说就是切分词语。给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换,单复数转换)

normalization的好处就是提升召回率(recall)

recall:搜索的时候,增加能够搜索到的结果的数量

analyzer 组成部分:

  1. character filter:在一段文本进行分词之前,先进行预处理,比如说最常见的就是,过滤html标签(hello --> hello),& --> and(I&you --> I and you)
  2. tokenizer:分词,hello you and me --> hello, you, and, me
  3. token filter:lowercase(小写转换),stop word(去除停用词),synonym(同义词处理),例如:dogs --> dog,liked --> like,Tom --> tom,a/the/an --> 干掉,mother --> mom,small --> little

一个分词器,很重要,将一段文本进行各种处理,最后处理好的结果才会拿去建立倒排索引。

2. 内置分词器的介绍

例句:Set the shape to semi-transparent by calling set_trans(5)

standard analyzer标准分词器:set, the, shape, to, semi, transparent, by, calling, set_trans, 5(默认的是standard)

simple analyzer简单分词器:set, the, shape, to, semi, transparent, by, calling, set, trans

whitespace analyzer:Set, the, shape, to, semi-transparent, by, calling, set_trans(5)

language analyzer(特定的语言的分词器,比如说,english,英语分词器):set, shape, semi, transpar, call, set_tran, 5

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/analysis-analyzers.html

三、测试分词器

GET /_analyze
{
"analyzer": "standard",
"text": "Text to analyze 80"
}

返回值:

{
"tokens" : [
{
"token" : "text",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "to",
"start_offset" : 5,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "analyze",
"start_offset" : 8,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "80",
"start_offset" : 16,
"end_offset" : 18,
"type" : "<NUM>",
"position" : 3
}
]
}

token:实际存储的term 关键字

position:在此词条在原文本中的位置

start_offset/end_offset:字符在原始字符串中的位置

ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer)的更多相关文章

  1. ElasticSearch(十八)初识分词器

    1.什么是分词器 作用:切分词语,normalization(提升recall召回率),如给你一段句子,然后将这段句子拆分成一个一个的单个的单词,同时对每个单词进行normalization(时态转换 ...

  2. Lucene.net(4.8.0) 学习问题记录二: 分词器Analyzer中的TokenStream和AttributeSource

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  3. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

  4. Lucene.net(4.8.0) 学习问题记录一:分词器Analyzer的构造和内部成员ReuseStategy

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  5. solr学习篇(二) solr 分词器篇

    关于solr7.4搭建与配置可以参考 solr7.4 安装配置篇  在这里我们探讨一下分词的配置 目录 关于分词 配置分词 验证成功 1.关于分词 1.分词是指将一个中文词语拆成若干个词,提供搜索引擎 ...

  6. ElasticSearch7.3 学习之定制分词器(Analyzer)

    1.默认的分词器 关于分词器,前面的博客已经有介绍了,链接:ElasticSearch7.3 学习之倒排索引揭秘及初识分词器(Analyzer).这里就只介绍默认的分词器standard analyz ...

  7. Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...

  8. 狂神说Elasticsearch7.X学习笔记整理

    Elasticsearch概述 一.什么是Elasticsearch? Lucene简介 Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简 ...

  9. ElasticSearch7.3学习(二十五)----Doc value、query phase、fetch phase解析

    1.Doc value 搜索的时候,要依靠倒排索引: 排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序. 所谓的正排索引,其实就是doc values. 在建立索引 ...

随机推荐

  1. list和tuple的用法区别

    1.list中是可变的,tuple不可变  所以tuple没有insert, pop,append方法 2.定义只有一个元素的tuple的时候,必须加逗号,否则不会被认为是tuple,而被识别为括号 ...

  2. Java-基于JDK的动态代理

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11686615.html 简单的记录一下Java中自带动态代理的用法. 准备材料: 1.一个接口 ...

  3. 注解的使用、拦截器使用、AOP切面使用

    Java 自定义注解及使用场景 转载: https://www.jianshu.com/p/a7bedc771204 Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自 ...

  4. go基础——变量与常量

    变量 package main import "fmt" /* 变量:variable 概念:一小块内存,用于存储数据,在程序运行过程中数值可以改变 特性:静态语言,强类型语言 * ...

  5. 了解selenium这个工具

    selenium 也不是简单一个工具,而是由几个工具组成,每个工具都有其特点和应用场景.   selenium IDE selenium IDE 是嵌入到Firefox浏览器中的一个插件,实现简单的浏 ...

  6. 5个不常提及的HTML技巧

    2021年你需要知道的HTML标签和属性 Web开发人员都在广泛的使用HTML.无论你使用什么框架或者选择哪个后端语言,框架在变,但是HTML始终如一.尽管被广泛使用,但还是有一些标签或者属性是大部分 ...

  7. Java线程的实现/创建方式

    1.继承Thread类: Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例. 启动线程的唯一方法就是通过 Thread 类的 start()实例方法. start( ...

  8. yaml语法及格式校验

    基本语法 1.yml文件以缩进代表层级关系 2.缩进不允许使用tab只能使用空格 3.空格的个数不重要,只要相同层级的元素左对齐即可 4.大小写敏感 5.数据格式为,名称:(空格)值 也就是说,如果冒 ...

  9. [c语言]左移和右移

    左移和右移都是位运算的概念.我们知道计算机是基于二进制保存数据的,因此左移和右移的概念十分重要.本文约定是32位的机器. [左移] 丢弃最高位,0补最低位 左移是把一个数按照二进制每位向左移动若干位, ...

  10. C# 枚举器(enumerator)

    总结: 1.枚举器就像是序列中的"游标"或"书签".可以有多个"书签",移动其中任何一个都可以枚举集合,与其他枚举器互不影响.用来遍历数据结 ...