这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
本Elasticsearch相关文章的版本为:7.4.2
Elasticsearch已经自带了很多很好用的分析器,比如standard,whitespace, lowercase。但是这些对于英语母系国家比较友好。为了满足其他语系国家的需要,Elasticsearch提供了自定义分析器的支持。
一个分析器由 一个或多个字符过滤器、一个分词器和和一个或多个词汇单元过滤器三部分构成,并且按上述的三部分依次顺序执行:原始字符串 --> 字符过滤器 --> 分词器 --> 词汇过滤器,最后得到一组token(词汇)。
字符过滤器
字符过滤器是用来预清洗或整理尚未进行分词的字符串。例如我们需要处理的是HTML格式的数据,那么我们可以使用Elasticsearch提供的去除HTML标签的 html_strip 字符过滤器。例如,去除<p></p>等标签对。一个分析器可以有一个或多个字符过滤器
分词器
分词器负责把经过字符过滤器处理后的字符串拆分成词条或词汇单元。Elasticsearch也提供很多遍历的分词器。例如standard分词器就根据单词边界拆分成独立词条,同时移除大部分的标点符号; whitespace分词器直接根据空格拆分成独立词条。一个分析器只允许有唯一一个分词器
词汇单元过滤器
词汇单元过滤器负责把经过分词器处理后的每个独立词条逐个顺序经过一个或多个词汇单元过滤器。例如把每个独立词条经过lowercase词汇单元过滤器处理后得到小写后的独立词条。
自定义分析器
我们希望对输入的内容要去掉html标签,然后根据空格分词,最后统一小写。
实现移除html标签的字符过滤器:
"char_filter": {
"html_strip_filter": {
"type": "html_strip"
}
}
实现根据空格分词的分词器:
"tokenizer": "whitespace",
实现统一小写的词汇单元过滤器:
"filter": {
"lowercase_filter": {
"type": "lowercase"
}}
所以汇总起来就是:
{
"settings": {
"analysis": {
"char_filter": {
"html_strip_filter": {
"type": "html_strip"
}},
"filter": {
"lowercase_filter": {
"type": "lowercase"
}},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": [ "html_strip_filter"],
"tokenizer": "whitespace",
"filter": [ "lowercase_filter" ]
}}
}}}