文章目录
- 文档分析的过程
- 测试分词器
- 测试标准的分词器
- 指定分析器
- IK 分词器
- IK 分词器扩展词汇
- 自定义分析器
文档分析的过程
- 将文档分成适合于倒排索引的独立的词条.
- 将词条统一化为标准格式, 例如英语中去除时态
分析器执行上面的内容, 实际上是将上面的功能封装到了包里.
字符过滤器 : 将字符串按顺序通过每个字符过滤器, 在分词前整理字符串, 一个字符过滤器用来去掉html, 或者将 & 转化为 and
分词器: 字符串被分词器分为单个的词条, 一个简单的分词器遇到空格和标点符号的时候, 会将文本拆分为词条.
token 过滤器: 词条按顺序通过每个 token 过滤器. 可能会改变词条, 小写化, 删除无用词条, 增加同义词等.
es 内置的分析器:
标准分析器
简单分析器
空格分析器
语言分析器
分析器的使用场景 :
把文本进行拆解.
索引一个文档, 这个文档的全文域被分析成词条, 用以创建倒排索引,
搜索的时候, 把查询字符串通过相同的分析过程, 以保证搜索的词条格式与索引中的词条一致.
测试分词器
测试标准的分词器
启动windows 的es , 发送如下的get请求 :http://localhost:9200/_analyze
请求体如下
{
"analyzer": "standard",
"text": "Text to analyze"
}
得到的响应如下. 可以看到被分成了一个一个单词.
{
"tokens": [
{
"token": "text",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "to",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "analyze",
"start_offset": 8,
"end_offset": 15,
"type": "<ALPHANUM>",
"position": 2
}
]
}
指定分析器
IK 分词器
如果使用默认的分词器, 使用中文, 那么就会是如下的效果.
把中文分成了一个一个的单字.
采用 IK 中文分词器,下载地址为:
https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0
解压后放到es 的pluins 目录下, 之后重新启动es
发送post请求, http://localhost:9200/_analyze , 请求体如下.
{
"text":"测试单词",
"analyzer":"ik_max_word"
}
结果可以看到对词语进行了分词
ik_max_word : 最细粒度拆分
ik_smart: 最粗粒度的拆分
两种分词器的拆分区别如下. ik_max_word 拆分更为细致.
IK 分词器扩展词汇
在ik分词器的目录下,
新建custom.dic文件. 文件内容填写如下的词语
弗雷尔卓德在IKAnalyzer.cfg.xml
中进行修改. 设置扩展词汇的位置
之后重启es, 对其进行测试
{
“text”:“弗雷尔卓德”,
“analyzer”:“ik_max_word”
}
结果如下, 成功对扩展词关联.
自定义分析器
自己设置字符过滤器, 分词器, 词汇单元过滤器, 来创建自定义的分析器.
使用put请求, 创建如下的索引, 知道分析器相关配置http://localhost:9200/my_index
请求体如下 :
{
"settings":{
"analysis":{
"char_filter":{
"&_to_and":{
"type":"mapping",
"mappings":[
"&=> and " // 把& 转化为 and
]
}
},
"filter":{
"my_stopwords":{
"type":"stop",
"stopwords":[
"the",
"a"
]
}
},
"analyzer":{
"my_analyzer":{ // 分词器的名称
"type":"custom", // 分词器类型, 此处为自定义的分词
"char_filter":[ // 字符过滤器
"html_strip",
"&_to_and"
],
"tokenizer":"standard", // 使用标准的分词器
"filter":[ // 使用字符过滤器
"lowercase",
"my_stopwords"
]
}
}
}
}
}
测试:
# GET http://127.0.0.1:9200/my_index/_analyze
{
"text":"The quick & brown fox",
"analyzer": "my_analyzer"
}
分词结果如下
{
"tokens": [
{
"token": "quick",
"start_offset": 4,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "and",
"start_offset": 10,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "brown",
"start_offset": 12,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "fox",
"start_offset": 18,
"end_offset": 21,
"type": "<ALPHANUM>",
"position": 4
}
]
}
可以看到 the 没有被分词, 因为它是停用词.
并且 & 变成了 and