Day01-分词器(analyzer)

Posted on 2024-11-04 15:29  请叫我劉兟森ヾ  阅读(2)  评论(0编辑  收藏  举报


1.character filters字符过滤
字符过滤器将原始文本作为字符接收,并且可以通过添加、删除、更改字符来转换字符流。
字符过滤分类如下:
(1)HTML Strip Character Filter
用途:删除HTML元素,如,并解码HTML实体,如@amp.
(2)Mapping Character Flilter
用途:替换指定的字符。
(3)Pattern Replace Character Filter
用途:基于正则表达式替换指定字符

2.tokenizers文本切分为分词
接收字符流(如果包含character filter字符过滤,则接收过滤后的字符流;否则,接收原始字符流),同时记录分词之后的顺序或位置(position),以及开始值(start_offset)和偏移值(end_offset-start_offset)。
tokenizers分类如下:
(1).Standard Tokenizer(标准分词器)
(2).Letter Tokenizer(字母分词器)
(3).Lowercase Tokenizer(小写分词器)
(4)......

3.Token filter分词后再过滤
针对tokenizers处理后的字符流进行再加工,比如:转小写、删除(删除停用词)、新增。

4.Elasticsearch自带的Analyzer
(1).Standard Analyzer
标准分词器是默认分词器,如果未指定,则使用该分词器。它基于Unicode文本分割算法,适用于大多数语言。
(2).Whitespace Analyzer
基于空格字符切词
(3)Stop Analyzer
在simpe Analyzer的基础上,移除停用词
(4)Keyword Analyzer
不切词,将整个字符串一起返回。
.....

5.自定义分词器的模板
自定义分词器在Mapping的setting部分设置
PUT my_custom_index
{
"settings":{
analysis":{
'char filter":{},
"tokenizer":{},
"filter":{},
analyzer":{}
}
}
}

还是由四部分组成:
(1).char_filter————字符过滤部分
(2).tokenizer——————对应文本切分为分词部分
(3).filter——————对应分词后再过滤
(4).analyzer——————对应分词器组成部分,其中组合包含(1)、(2)、(3)

6.分词器实践

在集上有一个索引 task2,brand 字段 match 搜索 Yoo-Hoo 有 3 个文档返回,match 搜索 YooHoo 有 0 个文档返回,请重建 索引 task2 到 task2_new 索引上,并满足以下要求:

集群的 brand 字段包含关键字 Yoo-Hoo 和 YooHoo,不管搜索 Yoo-Hoo 还是 YooHoo,它的结果应该一样,都是3个。

task2_new 和 task2 的 doc 和 mapping 一样,mapping 要拷贝,不能直接 reindex

PUT task2
{
"mappings": {
"properties": {
"brand": {
"type": "text"
}
}
}
}

PUT task2/_bulk
{"index": {}}
{"brand": "Yoo-Hoo"}
{"index": {}}
{"brand": "Yoo-Hoo"}
{"index": {}}

答案

创建新索引task2_new并添加mapping

DELETE task2_new

PUT task2_new
{
"mappings": {
"properties": {
"brand": {
"type": "text",
"analyzer": "synonym"
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "standard",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"lenient": true,
"synonyms": [ "YooHoo => Yoo-Hoo" ]
}
}
}
}
}
}

POST _reindex
{
"source": {
"index": "task2"
},
"dest": {
"index": "task2_new"
}
}

查询数据(3个文档)

GET task2_new/_search
{
"query": {
"match": {
"brand": "Yoo-Hoo"
}
}
}

查询数据(3个文档)

GET task2_new/_search
{
"query": {
"match": {
"brand": "YooHoo"
}
}
}