分析器的剖析
分析器——无论是内置的还是自定义的——本质上就是一个包含三个底层构建块的包:字符过滤器、分词器和词元过滤器。
内置分析器将这些构建块预先打包成适用于不同语言和文本类型的分析器。Elasticsearch 也单独暴露这些构建块,以便将它们组合起来定义新的自定义分析器。
字符过滤器
字符过滤器接收原始文本字符流,可以通过添加、移除或更改字符来转换该流。例如,字符过滤器可以将印度-阿拉伯数字(٠١٢٣٤٥٦٧٨٩)转换为其对应的阿拉伯-拉丁数字(0123456789),也可以从字符流中剥离 <b> 等 HTML 元素。
一个分析器可以有零个或多个字符过滤器,它们按顺序应用。
分词器
分词器接收一个字符流,将其拆分为独立的词元(通常是单个单词),并输出一个词元流。例如,空白分词器(whitespace tokenizer)在遇到任何空白字符时都会将文本拆分为词元。它会把文本 "Quick brown fox!" 转换为词项 [Quick, brown, fox!]。
分词器还负责记录每个词项的顺序或位置(position),以及该词项所代表的原始单词的起止字符偏移量(character offsets)。
一个分析器必须有且只有一个分词器。
词元过滤器
词元过滤器接收词元流,可以添加、移除或更改词元。例如:
- lowercase 词元过滤器将所有词元转换为小写
- stop 词元过滤器从词元流中移除
the等常见词(停用词) - synonym 词元过滤器向词元流中引入同义词
词元过滤器不允许更改每个词元的位置或字符偏移量。
一个分析器可以有零个或多个词元过滤器,它们按顺序应用。