
4.5 内置分析器与中文分析器
Elasticsearch内置了很多分析器,这些分析器以名称标识,不需要做太多的配置就可以直接使用。比如前面提到的standard、simple、english等都是内置分析器,这些分析器可直接使用,或者通过配置生成自定义的分析器再使用。新分析器需要在创建索引时定义,例如:

示例4-27 自定义分析器
在示例4-27中,创建了一个索引analyzer_test,并定义了一个名为my_analyzer的分析器。该分析器基于standard分析器,但将词项最大长度设置为5,并定义了一组停止词。它们通过max_token_length和stopwords参数设置,有关它们的说明请参考下面standard分析器的介绍。完成了分析器的定义后,就可以在_analyzer接口中使用了:

示例4-28 使用自定义分析器
由于定义了停止词,在示例4-28中分析的文档this和is这两个词项会从最终结果中剔除;而elasticsearch、logstash和kibana这三个词项,由于长度超过5将被拆分为多个词项。在定制分析器使用的type参数指定了基于哪种分析器做定制,但并不是每一种分析器都可以定制。每一种可定制的分析器在定制时又有自己可用的参数,这些参数将在介绍具体分析器时讲解。
4.5.1 standard分析器
standard分析器是默认分析器,它使用标准分词器(Standard Tokenizer,standard)提取词项。标准分词器提取词项的规则是根据Unicode文本分隔规范中定义的标准分隔符区分词项,可以在官网“http://unicode.org/reports/tr29/”中可以查看完整定义。比较常见的分隔符包括空格、换行、标点符号、数学运算符等等,主要针对类似英文这种拼写类语言。standard分析器没有字符过滤器,但包含了三个词项过滤器。它们分别是
● 标准词项过滤器(Standard Token Filter):只是占位,实际没做任何处理;
● 小写字母过滤器(Low Case Token Filter):作用是将词项转换成小写字母;
● 停止词过滤器(Stop Token Filter):将停止词删除,默认关闭。
所以在默认情况下,standard分析器的实际分词效果是使用Unicode文本分隔规范提取词项并全部转换为小写。standard分析器是可配置分析器,可使用配置参数见表4-4。
表4-4 standard分析器配置参数

4.5.2 stop分析器
stop分析器使用小写字母分词器(Lowercase Tokenizer,lowercase),分词规则是使用所有非字母分隔单词,并且会将提取出来的词项转换为小写。所以使用stop分析器提取出来的词项一定不会包含数字、空格、标点符号等特殊字符。stop分析器没有字符过滤器,但包含一个停止词过滤器。这个过滤器与standard中的停止词过滤器是相同的,只是它的默认值为_english_而不是_none_。停止词过滤器针对每一种语言内置了一组停止词,它们包含了每种语言中常见的停止词。这些内置的停止词如下:
_arabic_,_armenian_,_basque_,_bengali_,_brazilian_,_bulgarian_,_catalan_,_czech_,_danish_,_dutch_,_english_,_finnish_,_french_,_galician_,_german_,_greek_,_hindi_,_hungarian_,_indonesian_,_irish_,_italian_,_latvian_,_norwegian_,_persian_,_portuguese_,_romanian_,_russian_,_sorani_,_spanish_,_swedish_,_thai_,_turkish_
停止词除了可以使用上述内置停止词以外,还可以通过stopwords参数使用数组定义停止词全集,或者通过stopwords_path参数指定停止词文件路径。停止词文件是定义停止词全集的另一种方式,它的基本格式是每行定义一个停止词,所以可以按行将所有停止词声明在文件中。
所以stop分析器在使用上的实际效果就是以非字母分隔单词,并且在词项结果中去除所有英文停止词。stop分析器也是一种可配置的分析器,可使用配置参数见表4-5。
表4-5 stop分析器配置参数

4.5.3 pattern分析器
pattern分析器使用模式分词器(Pattern Tokenizer,pattern),该分词器使用Java正则表达式匹配文本以提取词项,默认使用的正则表达式为“\W+”,即以非字母非数字作为分隔符。pattern分析器没有字符过滤器,但包含两个过滤器——小写字母过滤器和停止词过滤器。这两个过滤器与standard分析器中的过滤器完全一样,所以pattern分析器默认提取出来的词项也会被转换为小写并且不包含停止词。
pattern分析器是可配置分析器,参数主要是设置正则表达式和停止词,见表4-6。
表4-6 pattern分析器配置参数

4.5.4 custom分析器
custom分析器可以理解为一个虚拟的分析器,不能直接使用。但custom分析器是一个可配置的分析器,一个专门用于自定义的分析器,在custom基础上配置出来的自定义分析器是可以使用的。前述几个可配置的分析器虽然也可配置,但不能在配置中替换字符过滤器、分词器和分词过滤器。而custom分析器的配置参数中包含char_filter、tokenizer、filter三个参数,可以通过它们定义需要使用的字符过滤器、分词器和分词过滤器。由于分词器是分析器必要的组件,所以在配置custom分析器时tokenizer参数是必选项。custom分析器可用配置参数见表4-7。
表4-7 custom分析器配置参数

Elasticsearch内置提供了十多种分词器、几十种分词过滤器,但常用的几种在前述分析器介绍中已经见过。对于其他分词器和分词过滤器,因为它们并不常用,也限于篇幅,本节就不展开介绍了,读者可到Elasticsearch官方网站找到相关资料。
4.5.5 其他内置分析器
前述几个分析器都是可以配置的分析器,下面再来看几个不可配置的分析器simple、whitespace和keyword。它们不仅不可配置,而且都没有字符过滤器和词项过滤器。
simple分析器与stop分析器一样使用小写字母分词器(Lowercase Tokenizer,lowercase),所以提取出来的分词与stop分析器相同。只是simple分析器没有过滤器,所以不能做停词处理。whitespace分析器使用空格作为词项分隔符,提取出来的词项不做大小写转换,使用的分词器是空格分词器(Whitespace Tokenizer,whitespace)。keyword分析器是一个不做任何处理的分析器,它会将文档内容整体作为一个词项返回,使用的分词器是关键字分词器(Keyword Tokenizer,keyword)。
除了以上分析器,Elasticsearch还提供了一组与语言相关的分析器,用于处理各种语言内容的文档。这组分析器有30多种,支持世界上大多数语言。其中可以用来处理中文的分析器为cjk,cjk是China、Japan和Korea三个单词的简写,代表以东亚国家为主的象形文字。但cjk在处理中文时并不好用,它会把每个汉字都提取为词项,所以意义不大。
4.5.6 中文分析器
中文分析器中比较有名就是IK,包括ik_smart、ik_max_word两种。这两者的区别在于它们提取词项的粒度上,前者提取粒度最粗,而后者则最细。比如“中文分析器”使用ik_smart只会提取出“中文”和“分析器”两个词项,而使用ik_max_word则会提取出“中文”“分析器”“分析”和“器”四个词项。也就是说,ik_max_word会从文本中穷尽所有可能的词语组合,所以它提取出来的词项会远多于ik_smart。
Elasticsearch默认并不支持IK,所以在使用IK前需要以插件的形式将它安装到Elasticsearch中。安装IK插件可以直接将插件解压缩到Elasticsearch的plugins目录中,也可以通过elasticsearch-plugin命令完成安装。先到IK在github上的地址,选择合适的版本下载安装包,IK版本必须要与Elasticsearch版本严格一致,否则在启动Elasticsearch时会报错。IK下载地址为“https://github.com/medcl/elasticsearch-analysis-ik/releases”。
如果采用直接解压缩的方式安装IK,需要在Elasticsearch的安装路径下找到plugins目录,并在这个目录创建一个新文件夹并命名为ik,然后将安装包直接解压缩到这个目录。IK插件安装的目录名称并非一定要叫ik,只要这个目录在plugins路径下即可。如果使用elasticsearch-plugin命令安装IK就更简单了,这个命令位于Elasticsearch安装目录下的bin目录中。直接进入命令行,键入如下命令:

示例4-29 安装IK
示例4-29展示的是一条完整的命令,elasticsearch-plugin insall后接的是IK下载地址,将路径中的/v7.0.0和文件名中的7.0.0替换成需要的版本号即可。键入回车后,elasticsearch-plugin会到指定的路径下载IK,并将它安装到plugins路径中的analysis-ik目录中。无论以哪种方式安装IK,安装结束后都需要重新启动Elasticsearch。接下来就可以体验一下IK分析器了,如示例4-30所示:

示例4-30 使用IK
中文分析及IK分析器是一个很大的话题,本书限于篇幅不太可能面面俱到。有关IK分析器的更多介绍请参考官网,地址为“https://github.com/medcl/elasticsearch-analysis-ik”。