- 文档分析的过程
- 测试分词器
- 测试标准的分词器
- 指定分析器
- 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": "",
"position": 0
},
{
"token": "to",
"start_offset": 5,
"end_offset": 7,
"type": "",
"position": 1
},
{
"token": "analyze",
"start_offset": 8,
"end_offset": 15,
"type": "",
"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分词器的目录下, 新建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": "",
"position": 1
},
{
"token": "and",
"start_offset": 10,
"end_offset": 11,
"type": "",
"position": 2
},
{
"token": "brown",
"start_offset": 12,
"end_offset": 17,
"type": "",
"position": 3
},
{
"token": "fox",
"start_offset": 18,
"end_offset": 21,
"type": "",
"position": 4
}
]
}
可以看到 the 没有被分词, 因为它是停用词. 并且 & 变成了 and