Elasticsearch-7.4.2使用之中文分词

一. ElasticSearch分词概念

当我们在es中存储一个文档的时候,文档内容会被提取出若干词元去存储,方便检索。ES内置了很多分词器,但内置的分词器对中文的处理不好。下面进行介绍

二. ElasticSearch内置分词器

1. 内置分词器对英文的分词

http://localhost:9200/_analyze/
{
	"text":"hello world"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"hello",
            "start_offset":0,
            "end_offset":5,
            "type":"<ALPHANUM>",
            "position":0
        },
        {
            "token":"world",
            "start_offset":6,
            "end_offset":11,
            "type":"<ALPHANUM>",
            "position":1
        }
    ]
}

2. 内置分词器对中文的分词

http://localhost:9200/_analyze/
{
	"text":"我爱我的祖国"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"我",
            "start_offset":0,
            "end_offset":1,
            "type":"<IDEOGRAPHIC>",
            "position":0
        },
        {
            "token":"爱",
            "start_offset":1,
            "end_offset":2,
            "type":"<IDEOGRAPHIC>",
            "position":1
        },
        {
            "token":"我",
            "start_offset":2,
            "end_offset":3,
            "type":"<IDEOGRAPHIC>",
            "position":2
        },
        {
            "token":"的",
            "start_offset":3,
            "end_offset":4,
            "type":"<IDEOGRAPHIC>",
            "position":3
        },
        {
            "token":"祖",
            "start_offset":4,
            "end_offset":5,
            "type":"<IDEOGRAPHIC>",
            "position":4
        },
        {
            "token":"国",
            "start_offset":5,
            "end_offset":6,
            "type":"<IDEOGRAPHIC>",
            "position":5
        }
    ]
}

3. 结论

英文天生以空格分隔,自然就以空格来分词,这没有任何问题。
分词把每个汉字都独立分开来了,这对中文分词就没有意义了

二. 中文分词器ik

1. 下载安装

链接:https://pan.baidu.com/s/1sZHIk1wz7ohqziO_ayJksA  提取码:9z3d

在es的plugins目录下创建ik文件夹,并将ik包解压到ik目录下,重启es

2. ik分词器有两种模式ik_max_word和ik_smart

1)ik_max_word:按照最细粒度划分

http://localhost:9200/_analyze/
{
	"text":"世界如此之大",
        "analyzer":"ik_max_word"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"世界",
            "start_offset":0,
            "end_offset":2,
            "type":"CN_WORD",
            "position":0
        },
        {
            "token":"如此之",
            "start_offset":2,
            "end_offset":5,
            "type":"CN_WORD",
            "position":1
        },
        {
            "token":"如此",
            "start_offset":2,
            "end_offset":4,
            "type":"CN_WORD",
            "position":2
        },
        {
            "token":"之大",
            "start_offset":4,
            "end_offset":6,
            "type":"CN_WORD",
            "position":3
        }
    ]
}

2)ik_smart:最粗粒度的拆分

http://localhost:9200/_analyze/
{
	"text":"世界如此之大",
        "analyzer":"ik_smart"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"世界",
            "start_offset":0,
            "end_offset":2,
            "type":"CN_WORD",
            "position":0
        },
        {
            "token":"如此",
            "start_offset":2,
            "end_offset":4,
            "type":"CN_WORD",
            "position":1
        },
        {
            "token":"之大",
            "start_offset":4,
            "end_offset":6,
            "type":"CN_WORD",
            "position":2
        }
    ]
}

三. ik自定义词典

ik自身提供的分词词典无法满足特定的一些需求(如专用名词等),ik提供了自定义词典的功能,也就是用户可以自己定义一些词汇,这样ik就会把它们当作词典中的内容来处理。

1. 在ik的config目录下创建扩展名为.dic的文件,将词条加入进去

2. 重启es生效

3. 例如"王移薛力"两个人名,如果没有加入词条,分解结果

http://localhost:9200/_analyze/
{
	"text":"王移薛力",
    "analyzer":"ik_smart"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"王",
            "start_offset":0,
            "end_offset":1,
            "type":"CN_CHAR",
            "position":0
        },
        {
            "token":"移",
            "start_offset":1,
            "end_offset":2,
            "type":"CN_CHAR",
            "position":1
        },
        {
            "token":"薛",
            "start_offset":2,
            "end_offset":3,
            "type":"CN_CHAR",
            "position":2
        },
        {
            "token":"力",
            "start_offset":3,
            "end_offset":4,
            "type":"CN_CHAR",
            "position":3
        }
    ]
}

4. 将“王移薛力”加入词条,分解结果

http://localhost:9200/_analyze/
{
	"text":"王移薛力",
    "analyzer":"ik_smart"
}

操作成功后,响应的内容如下

{
    "tokens":[
        {
            "token":"王移",
            "start_offset":0,
            "end_offset":2,
            "type":"CN_WORD",
            "position":0
        },
        {
            "token":"薛力",
            "start_offset":2,
            "end_offset":4,
            "type":"CN_WORD",
            "position":1
        }
    ]
}

四. 项目中的应用

在应用中,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词。

1. 创建索引

http://localhost:9200/book/
{
	"mappings": {
		"properties": {
			"title": {
				"type": "text",
				"analyzer": "ik_max_word",         //存储
				"search_analyzer": "ik_smart"      //查找
			},
			"content": {
				"type": "text"
			}
		}
	}
}

2. 添加数据

http://localhost:9200/book/_doc/01/
{
	"title":"我爱我亲爱的祖国",
	"content":"2019年的10月1日,与往年的都不一样。转眼间,已经是我来到英国的第2个月。听母亲说,家乡的街道上挂满了五星红旗,就连晚霞的红都要比往常久一些。下课的铃声响起,我的心却早就飘到了课堂外去——我们几个中国留学生说好放学后一起看国庆盛典。虽然是重播,可那盛大的场面无不震撼着每一个中国人的心。当中国军人齐刷刷地转头敬礼,我的泪水在眼眶里打转,他们的每一个动作、每一个步伐都那样整齐划一、分秒不差。在那一刻,民族自豪感油然而生,我在心中喊了无数遍“我爱我的祖国"
}
http://localhost:9200/book/_doc/02/
{
	"title":"我爱我的家乡",
	"content":"家乡,是心bai中一首唱不完的歌,du家乡,是心中一根然不尽的火柴。每当我zhi独自骑车到桃花溪,这种对家乡的喜dao爱就像潮水一拥而上"
}

3. 检索

http://localhost:9200/book/_search/
{
    "query": {
        "match": { "title" : "我爱" }
    }
}

操作成功后,响应的内容如下

{
    "took":1,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":2,
            "relation":"eq"
        },
        "max_score":0.114749074,
        "hits":[
            {
                "_index":"book",
                "_type":"_doc",
                "_id":"02",
                "_score":0.114749074,
                "_source":{
                    "title":"我爱我的家乡",
                    "content":"家乡,是心bai中一首唱不完的歌,du家乡,是心中一根然不尽的火柴。每当我zhi独自骑车到桃花溪,这种对家乡的喜dao爱就像潮水一拥而上"
                }
            },
            {
                "_index":"book",
                "_type":"_doc",
                "_id":"01",
                "_score":0.097392075,
                "_source":{
                    "title":"我爱我亲爱的祖国",
                    "content":"2019年的10月1日,与往年的都不一样。转眼间,已经是我来到英国的第2个月。听母亲说,家乡的街道上挂满了五星红旗,就连晚霞的红都要比往常久一些。下课的铃声响起,我的心却早就飘到了课堂外去——我们几个中国留学生说好放学后一起看国庆盛典。虽然是重播,可那盛大的场面无不震撼着每一个中国人的心。当中国军人齐刷刷地转头敬礼,我的泪水在眼眶里打转,他们的每一个动作、每一个步伐都那样整齐划一、分秒不差。在那一刻,民族自豪感油然而生,我在心中喊了无数遍“我爱我的祖国"
                }
            }
        ]
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

victor-维克特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值