一、关于
-
1、概念相关
文本分析是将非结构化文本转换为结构化格式,以便于搜索的过程
文本分析器使 ElasticSearch 能够执行全文检索,返回所有相关的结果,而不仅仅是精确的匹配
-
2、组成部分
文本分析器由 字符过滤器、分词器、词项过滤器 三个构建块组成
字符过滤器(character filters)
接收原始文本,并对文本进行过滤处理,如处理文本中的html标签字符或将罗马数字转换成阿拉伯数字等,处理完后再交给分词器进行分词。一个文本分析器中可包含0个或多个字符过滤器,将按配置顺序依次进行处理
分词器(tokenizer)
接收一个字符流,并将文本分解成词项,然后输出一个词项流。一个文本分析器必需且只能包含一个分词器
词项过滤器(token filters)
接收词项流,并对词项流进行过滤处理,如转小写、停用词处理、同义词处理等。一个文本分析器中可包含0个或多个字符过滤器,将按配置顺序依次进行处理
-
3、作用时间
文本分析器会作用在 建立索引 和 全文检索 两个地方
建立索引时
当对一个文档建立索引时,会对文档的所有text类型字段的文本进行分析(分词)
全文检索时
当对一个text类型的字段进行全文检索时,会对用户输入的文本进行分析(分词)
二、分析器确认使用步骤
-
索引分析器
建立索引时,通过依次检查以下参数,来确定对文本字段要使用的分析器
如果映射索引时设置了 field 的 analyzer 参数,则使用该参数设置的分词器
如果创建索引时设置了 setting 的 analysis.analyzer.default 参数,则使用该参数设置的分词器
如果以上都没有设置,则使用默认的 standard 分词器
-
检索分析器
全文检索时,通过依次检查以下参数,来确定对查询文本要使用的分析器
如果查询语句中指定了 analyzer 参数,则检索时使用此参数指定的分词器
如果映射索引时设置了 field 的 search_analyzer 参数,则检索时使用此参数指定的分词器
如果创建索引时设置了 setting 的 analysis.analyzer.default_search 参数,则检索时使用此参数指定的分词器
如果映射索引时设置了 field 的 analyzer 参数,则检索时使用此参数指定的分词器
如果以上都没有设置,则使用默认的 standard 分词器
三、内置分析器
在 ElasticSearch 中,内置了多种分析器,无需额外配置即可直接用于索引或搜索
-
标准分析器(Standard Analyzer)
默认的分析器。将文本基于 Unicode 文本分割算法做分词,适用于大多数语言,中文会被单字分割
-
简单分词器(Simple Analyzer)
将文本在任何非字母中文等语言字符处分词,如数字、空格、连字符和括号等,丢弃非字母字符并改变大写字母为小写
-
关键词分词器(Keyword Analyzer)
将整个输入的文本作为一个词项返回,不做任何处理
-
空白分析器(Whitespace Analyzer)
将文本在空格字符处分词
-
停用词分析器(Stop Analyzer)
基于简单分词器而添加了对停用词支持的分析器,默认使用 _english_停用词表
四、中文分词器
内置的分词器对中文分词并不友好,可以使用第三方的 Analyzer 插件,比如 ik、pinyin 等
以 ik 为例,到
elasticsearch-analysis-ik
下载对应版本编译好的包,解压到 ES_HOME/plugins/analysis-ik 即可
在 ik 中,包含 ik_max_word 和 ik_smart 两种分词模式。ik_smart 会执行较粗粒度的分词,ik_max_word 会执行更细粒度的分词
五、分词器测试
通过 _analyze 接口,可以测试分析器的分词效果
GET /_analyze
{
"analyzer": "standard",
"text": "测试ElasticSearch不同分析器的分词效果"
}
// ----------------------------------------------------------
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "测试ElasticSearch不同分析器的分词效果"
}