专栏首页cwl_JavaElasticSearch(7.2.2)-浅谈es的分词原理

ElasticSearch(7.2.2)-浅谈es的分词原理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42528266/article/details/102864277

简介:谈谈elasticsearch的分词原理

前⾔⼀
  • 我们创建⼀个⽂档
PUT test/_doc/1
 {
	"msg":"乔丹是篮球之神"
 }
  • 我们通过’乔丹’这个关键词来搜索这个⽂档
POST /test/_search
{
	"query": {
		"match": {
			"msg": "乔丹"
		}
	}
}

我们发现能匹配⽂档出来,那整⼀个过程的原理是怎样的呢?

前⾔⼆
  • 我们来试下使⽤中⽂分词器
PUT test/_mapping
{
	"properties": {
		"msg_chinese": {
			"type": "text",
			"analyzer": "ik_max_word"
		}
	}
}
POST test/_doc/1
{
	"msg":"乔丹是篮球之神",
	"msg_chinese":"乔丹是篮球之神"
 }
POST /test/_search
{
	"query": {
		"match": {
			"msg_chinese": "乔"
		}
	}
}
POST /test/_search
{
	"query": {
		"match": {
			"msg": "乔"
		}
	}
}

为什么同样是输⼊’乔’,为什么msg能匹配出⽂档,⽽msg_chinese不能呢?

写时分词
  • 我们使⽤来分析这个msg这个字段是怎样分词的
POST test/_analyze
{
	"field": "msg",
	"text": "乔丹是篮球之神"
}

分词结果

乔,丹,是,篮,球,之,神
  • 再来分析这个msg_chinese这个字段是怎样分词的
POST test/_analyze
{
	"field": "msg_chinese",
	"text": "乔丹是篮球之神"
}

分词结果

乔丹, 是, 篮球, 之神
  • ⽂档写⼊的时候会根据字段设置的分词器类型进⾏分词,如果不指定就是默认的standard分词器。
  • 写时分词器需要在mapping中指定,⽽且⼀旦指定就不能再修改,若要修改必须重建索引。
读时分词
  • 由于读时分词器默认与写时分词器默认保持⼀致,拿上⾯的例⼦,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_chinese 时分词器则为 ik_max_word。这种默认设定也是⾮常容易理解的,读写采⽤⼀致的分词器,才能尽最⼤可能保证分词的结果是可以匹配的。
  • 允许读时分词器单独设置
POST test/_search
{
	"query": {
		"match": {
			"msg_chinese": {
				"query": "乔丹",
				"analyzer": "standard"
			}
		}
	}
}
  • ⼀般来讲不需要特别指定读时分词器,如果读的时候不单独设置分词器,那么读时分词器的验证⽅法与写时⼀致。
深⼊分析
  • 分析器(analyzer)有三部分组成
    • char filter : 字符过滤器
    • tokenizer : 分词器
    • token filter :token过滤器
  • char filter(字符过滤器)
    • 字符过滤器以字符流的形式接收原始⽂本,并可以通过添加、删除或更改字符来转换该流。⼀个分析器可能有0个或多个字符过滤器。
  • tokenizer (分词器)
    • ⼀个分词器接收⼀个字符流,并将其拆分成单个token (通常是单个单词),并输出⼀个token流。⽐如使⽤whitespace分词器当遇到空格的时候会将⽂本拆分成token。“eating an apple” >> [eating, and, apple]。⼀个分析器必须只能有⼀个分词器
POST _analyze
{
	"text": "eating an apple",
	"analyzer": "whitespace"
}
  • token filter (token过滤器)
    • token过滤器接收token流,并且可能会添加、删除或更改tokens。⽐如⼀个lower case token filter可以将所有的token转成⼩写。⼀个分析器可能有0个或多个token过滤器,它们按顺序应⽤。
standard分析器
  • tokenizer
    • Stanard tokenizer
  • token filters
    • Standard Token Filter
    • Lower Case Token Filter

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速学习-Git SSH免密操作

    Git支持https和ssh两种传输协议(https-每次输入密码,ssh-一次声明永久使用)

    cwl_java
  • 系统架构师论文-论虚拟现实技术的应用与发展

    本文介绍了虚拟现实技术的主要技术和应用,并结合作者本人参加的国家重点实验室的自然科学基金项目,重点讨论了基于图像的建模与绘制在虚拟现实中的重要地位与应用,详细分...

    cwl_java
  • 前端基础-Vue的生命周期

    每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、编译模板、将实例挂载到 DOM 并在数据变化时更新 DOM 等。同时在这个过程...

    cwl_java
  • FreeBSD下的工具(sysctl、netstat等)如何移植到F-Stack

    在之前的文章中,我们介绍了如何使用DPDK rte_ring来进行多进程的通信,tools/ipc目录就是基于rte_ring实现了一个简单的ipc框架。下面以...

    F-Stack
  • 面试Handler都没答上来,你真的了解Handler吗?Handler全面解析来了!

    用法很简单,定义一个handler,重写handleMessage方法处理消息,用send系列方法发送消息。 但是主线程和新建线程用法却有点不一样!其实新线程里...

    Android技术干货分享
  • Differences between OpenCV JavaCV and OpenCV4Android

    本文将介绍OpenCV,JavaCV以及OpenCV for Android(以下简称OpenCV4Android)之间的区别,并以一个人脸识别的Android...

    宅男潇涧
  • python学习 -女神或者男神把微信消息撤回后好慌,有了这个妈妈再也不担心你看不到女神或者男神撤回的消息了(超详解)

      有时候在忙工作,女朋友发了一个消息,就撤回了,但是人天生的都有一颗好奇心,而且在当今这个时代找个女朋友不容易,一个程序猿找一个女朋友更是不容易的。人家好不容...

    北京-宏哥
  • Access删除查询(二)

    大家好,上节介绍了删除查询中单表字段删除的示例演示,本节主要介绍下涉及多表的删除查询。

    无言之月
  • 78行Python代码帮你复现微信撤回消息!

    [ 导读 ]Python曾经对我说:"时日不多,赶紧用Python"。于是看到了一个基于python的微信开源库:itchat,玩了一天,做了一个程序,把私聊撤...

    数据派THU
  • 利用python成功查看对方微信撤回的消息!

    微信现已经成为了我们日常生活中不可缺少的联系交流工具了,然后有时你会碰到别人给你发消息,然后他突然来一波骚操作(对方已撤回一条消息)。。我就问你尴尬不尴尬老铁!...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券