Elasticsearch分词器
大约 3 分钟ElasticsearchElasticsearch
概述
分词器(Tokenizer)是Elasticsearch中用于将文本分割成词项(Tokens)的组件。它是在索引和搜索过程中对文本进行处理的关键部分。分词器将原始文本输入,按照一定的规则将其分割成有意义的词项,以便进行索引和搜索。
Elasticsearch提供了多种内置的分词器,以满足不同语言和需求的分词处理。以下是一些常用的分词器:
- Standard分词器:适用于大多数语言的默认分词器。它将文本按照空格和标点符号进行分割,并进行小写转换、去除停用词等处理。
- Whitespace分词器:根据空格字符进行简单的分割,不进行其他处理。
- Keyword分词器:将整个文本作为单个词项进行索引和搜索,不进行分割。
- Simple分词器:按照非字母字符进行分割,并进行小写转换。
- Language分词器:针对特定语言的分词器,如English、Chinese等。它们使用特定的规则和字典来处理相应语言的文本。
- Stop分词器:stop 分析器 和 simple 分析器很像,唯⼀不同的是,stop 分析器增加了对删除停⽌词的⽀ 持,默认使⽤了english停⽌词,stopwords 预定义的停⽌词列表,⽐如 (the,a,an,this,of,at)等等
- Pattern分词器:⽤正则表达式来将⽂本分割成terms,默认的正则表达式是\W+(⾮单词字符)
使用
示例使用
使用Whitespace分词器示例:
## 创建索引,这里自定了一个分词器,实际是使用whitespace
PUT /inde-aaa/
{
"settings": {
"analysis": {
"analyzer": {
"my-analyzer":{
"type": "whitespace"
}
}
}
},
"mappings": {
"properties": {
"content":{
"type": "text",
"analyzer": "my-analyzer"
},
"name":{
"type": "keyword"
}
}
}
}
## 插入测试数据
POST /inde-aaa/_doc/1
{
"name":"xw",
"content":"hello world"
}
## 测试查询
GET /inde-aaa/_search
{
"query": {
"match": {
"content": "world"
}
}
}
中文分词器
在Elasticsearch中,有多种中文分词器可用于将中文文本进行分词处理。以下是一些常用的中文分词器:
- Smartcn分词器:Smartcn是Elasticsearch自带的中文分词器之一。它基于Lucene的中文分词器,能够进行智能分词,具备较好的中文分词效果。
- IK分词器:IK是一款开源的中文分词器,也是Elasticsearch常用的中文分词器之一。它提供了细粒度和智能两种分词模式,支持中文词典扩展和自定义词典的功能。
- Jieba分词器:Jieba是Python中常用的中文分词库,也有对应的Elasticsearch插件。它基于统计算法和词典匹配,能够进行精确分词和全模式分词。
- Ansj分词器:Ansj是一款开源的中文分词器,提供了多种分词模式和分词算法。它具备较高的分词速度和较好的分词效果。
以IK分词器使用为例,
首先需要安装ik分词器插件,由于我是容器部署的ES,可以直接进入容器进行安装:
## 进入容器 docker exec -it elasticsearch bash ## 安装分词器 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip ##退出容器 exit ##重启es docker restart elasticsearch
创建索引
PUT /inde-bbb/ { "mappings": { "properties": { "content":{ "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_smart" }, "name":{ "type": "keyword" } } } }
添加测试数据
POST /inde-bbb/_doc/1 { "name":"xw", "content":"向往好好学习天天向上" }
测试查询结果如下图所示: