前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ElasticSearch(7.2.2)-浅谈es的分词原理

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

作者头像
cwl_java
发布2019-11-04 11:26:46
4.2K0
发布2019-11-04 11:26:46
举报
文章被收录于专栏:cwl_Javacwl_Java

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

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

简介:谈谈elasticsearch的分词原理

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

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

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

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

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

分词结果

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

分词结果

代码语言:javascript
复制
乔丹, 是, 篮球, 之神
  • ⽂档写⼊的时候会根据字段设置的分词器类型进⾏分词,如果不指定就是默认的standard分词器。
  • 写时分词器需要在mapping中指定,⽽且⼀旦指定就不能再修改,若要修改必须重建索引。
读时分词
  • 由于读时分词器默认与写时分词器默认保持⼀致,拿上⾯的例⼦,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_chinese 时分词器则为 ik_max_word。这种默认设定也是⾮常容易理解的,读写采⽤⼀致的分词器,才能尽最⼤可能保证分词的结果是可以匹配的。
  • 允许读时分词器单独设置
代码语言:javascript
复制
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]。⼀个分析器必须只能有⼀个分词器
代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前⾔⼀
  • 前⾔⼆
  • 写时分词
  • 读时分词
  • 深⼊分析
  • standard分析器
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档