elasticSearch-同义词分词器自定义实践
概述
在英语中,一个单词常常是另一个单词的“变种”,如:happy=>happiness,这里的变形就是处理单复数,happy叫做happiness的词干(stem)。而adult=>man,woman,是处理同义词。
或者再如下面,需要达到搜索都能搜索出来,达到一定精确度。
1 | 裙子,裙 |
于是就有了需要自定义分词器解决同义词的场景。
实践自定义分词器
自定义分词器其实也就是组合
- Character Filter
- Tokenizer
- Token Filter
这三个的过程。默认分词器仅仅是把这3个默认组合了。
Character Filters
- 在 Tokenizer 之前对文本进行处理,例如增加删除及替换字符。可以配置多个 Character Filters。会影响 Tokenizer 的 position 和 offset 信息
- 一些自带的 Character Filters
HTML strip
- 去除 html 标签Mapping
- 字符串替换Pattern replace
- 正则匹配替换
Demo char_filter
html_strip 去除html标签
1 | POST _analyze |
mapping 字符串替换
1 | POST _analyze |
pattern_replace 正则表达式
1 | GET _analyze |
Tokenizer
- 将原始的文本按照一定的规则,切分为词(term or token)
- Elasticsearch 内置的 Tokenizers
whitespace
|standard
|uax_url_email
|pattern
|keyword
|path hierarchy
Demo tokenizer
path_hierarchy 通过路劲切分
1 | POST _analyze |
Token tokenizer Filter
- 将 Tokenizer 输出的单词,进行增加、修改、删除
- 自带的 Token Filters
Lowercase
|stop
|synonym
(添加近义词)
Demo filter
whitespace 空格
1 | GET _analyze |
自定义 analyzer
- 官网自定义分词器的标准格式
1 | 自定义分析器标准格式是: |
- 自定义分词器
1 | #定义自己的分词器 |
自定义同义词需求解决
- synonym_graph
我们定义一个my_synonym_filter
的filter进行处理同义词,
同时自定义自己的分词器my_custom_analyzer
,并指定字段title
使用my_custom_analyzer
分词器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
},
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"british,english",
"queen,monarch"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_custom_analyzer",
"search_analyzer": "my_custom_analyzer"
},
"author": {
"type": "keyword"
}
}
}
}
测试一下分词器的效果
1 | POST my_index/_analyze |
我们会发现Elizabeth is the English queen
,包含了english,而我们设置了british,english
,为同义词,所以分词器就包含了british,english
1 | { |
我们再通过插入数据来测试一下 queen,monarch
同义词
1 |
|
我们发现我们能通过monarch 查询出来含queen的数据
1 | { |
自此解决同义词的需求
动态设置同义词的方案
开启热更新,仅仅适用search_analyzer
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/indices-reload-analyzers.html
1 | PUT my_index |
热更新重载分词器
1 | POST my_index/_reload_search_analyzers |
专题目录
ElasticStack-安装篇
ElasticStack-elasticsearch篇
ElasticStack-logstash篇
elasticSearch-mapping相关
elasticSearch-分词器介绍
elasticSearch-分词器实践笔记
elasticSearch-同义词分词器自定义实践
docker-elk集群实践
filebeat与logstash实践
filebeat之pipeline实践
Elasticsearch 7.x 白金级 破解实践
elk的告警调研与实践