什么是分词器插件?
分词器是ES中提供对文本内容进行按语种进行分词的插件系统。不同的语言的文字分词规则是不一样的。而ES提供的插件机制就可以很好的集成各种语种的分词器。
分词器插件的作用?
分词器主要作用是把文本拆成一个个最小粒度的单词然后给ES系统作为索引系统的词条使用。不同语种拆分单词规则也是不一样的。如:中国人民共和国 应该被拆分成:中国、中国人民、人民、共和国、人民共和国、中国人民共和国。而不能拆分成:中、国、人、民、共、和、国。被拆分后的词就可以作为索引词条来构建索引系统。这样就可以使用部分内容进行搜索了
分词器插件工作流程?
1、ES在启动过程中会读取plugins/分词器/plugin-descriptor.properties文档
2、读取配置文件并获取分词器插件的类信息并初始化(属性classname指向的类路径)
3、在分词器插件启动类必须继承AnalysisPlugin,这样ES可以调用我们自定义的类来获取分词器对象
4、在ES调用分词进行分词时会实例化analyzerProvider对象,该对象中有get()可以获取到我们自定义的Analyzer对象,同时内部tokenStream()方法会条用createComponents()方法实例化我们自定义的Tokenizer对象。
5、Tokenizer是自定义分词器的核心组件。核心方法有4个
① incrementToken():用来判断分词集合列表中是否还存在没读取的词条信息。以及设置term的基础属性如:长度,起始偏移量,结束偏移量,词条等
② reset():重置默认数据和加载自定义模型来处理用户输入的字符串数据并进行分词处理。加入到分词集合列表
③ end():设置当分词结束的偏移量信息
④ Close(): 销毁输入流对象和自定义的数据
6、Tokenizer对象每次完成一次用户输入文本的分词过程都会进行上述4步方法调用
分词器验证
1、可以下载一个ES程序包。只安装一个节点就可以验证
2、安装分词器
3、执行bin/elasticsearch启动ES
4、验证分词器
curl --location --request GET '172.16.80.24:9200/_analyze' \
--header 'Content-Type: application/json' \
--data-raw '{
"analyzer": "stanford-core-nlp",
"text": ["中国人民共和国"]
}'
5、新建索引
curl --location --request PUT '172.16.80.24:9200/zww-email-test1' \
--header 'Content-Type: application/json' \
--data-raw '{
"mappings": {
"default": {
"properties": {
"commonText": {
"properties": {
"cn": {
"type": "text",
"analyzer": "stanford-core-nlp"
}
}
},
"email": {
"type": "text",
"analyzer": "stanford-core-nlp",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"ip": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"phone": {
"type": "long"
}
}
}
}
}'
6、写入数据测试
curl --location --request PUT '172.16.80.24:9200/zww-email-test1/default/13' \
--header 'Content-Type: application/json' \
--data-raw '{
"commonText.cn":"中华人民共和国",
"email":"zhangweiwei@semptian.com",
"phone":17605888987,
"ip":"192.168.80.154"
}'
7、查询
curl --location --request GET '172.16.80.24:9200/zww-email-test1/_search' \
--header 'Content-Type: application/json' \
--data-raw '{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "人民"
}
}
]
}
}
}'
分词器插件Demo
https://gitee.com/xfbyxq/semptian-analyzer.git