ayalysis以往对于我来说是个黑盒,并不清楚ES这个重要组件到底是如何进行分析的。属于知道个大概,但一深入就很模糊的状态。
概述
一种Analyzer -内置或自定义是否-仅仅是包含三个低级别构建块包:character filters(字符过滤器), tokenizers(分词器)和token filters(令牌过滤器)
-
character filters
首先,字符过滤器接收原始文本字符的流,并且可以通过添加,移除,或改变字符变换流。例如,可以使用字符过滤器将印度语 - 阿拉伯数字(0 12345678 9)转换为其阿拉伯语 - 拉丁语等价物(0123456789),或者<b>从流中删除HTML元素。
其次,这个字符过滤器filter和众多filter是可以多个进行处理的 -
Tokenizer
分词器,接收字符流,并将它分为独立的tokens (通常是单词),如,whitespace只要看到任何空格,tokenizer就会将文本分成标记。它会将文本 "Quick brown fox!"转换为术语[Quick, brown, fox!]
标记器还负责记录每个术语的顺序或位置以及该术语所代表的原始单词的开始和结束字符偏移。 -
Tip:分析器必须只有一个 Tokenizer
-
Token filters
令牌滤波器接收到令牌流,并且可以添加,删除或改变令牌。例如,lowercase令牌过滤器将所有令牌转换为小写, stop令牌过滤器从令牌流中删除常用词(停用词)the, synonym令牌过滤器将同义词引入令牌流。
令牌过滤器不会更改每个令牌的位置或字符偏移量。
分析器可以具有零个或多个 令牌过滤器,这些过滤器按顺序应用。
- 所以,除了ES内置的analyzer,只要你指定这3项内容,你可以定制符合业务需要的analyzer
测试 analyzer
POST _analyze
{
"tokenizer": "standard",
"filter": [ "lowercase" ],
"text": "test analyze ok"
}
结果为
"tokend":[
{
"token":"test",
"start_offset":0,
"end_offset":4,
"type":"<ALPHANUM>",
"position":0
}
...
]
可以看到,解析后,结果包含了 token,原文本起始和结束位置,解析后的相对位置
网友评论