概述
这篇文章主要是来浅谈一下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。比如一个lowercase token filter可以将所有的token转成小写。一个分析器可能有0个或多个token过滤器,它们按顺序应用。
-
-
standard分析器
-
tokenizer
-
Stanard tokenizer
-
-
token filters
-
Standard Token Filter
-
Lower Case Token Filter
-
-
最后
以上就是辛勤可乐为你收集整理的浅谈elasticsearch的分词原理的全部内容,希望文章能够帮你解决浅谈elasticsearch的分词原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复