目录
一、分词器的基本概念
二、分词器类别
(1)默认分词器
(2)IK分词器
(3)拼音分词器
(4)自定义分词器
一、分词器的基本概念
在Elasticsearch中,分词器(Tokenizer)是一个用于将文本数据分割成单独的词汇单元的组件。这是搜索引擎索引和搜索文本数据的重要步骤之一。分词器的任务是将输入的文本按照一定的规则拆分成一个个词汇单元,以便在建立索引和执行搜索时能够更精确地匹配和检索文档。
分词器通常包括两个主要组件:分词器(Tokenizer)和过滤器(Filter)。这两个组件的组合定义了文本数据如何被拆分和处理。
分词器(Tokenizer): 分词器负责将输入文本切分成词汇单元。它的工作是根据一些规则(例如空格、标点符号等)将文本拆分成词汇单元。
过滤器(Filter): 过滤器负责对分词后的词汇进行进一步的处理,以改变或增强这些词汇。例如,可以使用过滤器进行小写转换、去除停用词、词干提取等操作。
Elasticsearch提供了许多内置的分词器和过滤器,同时也支持用户自定义分词器。这使得用户能够根据其特定的需求选择合适的分词器和过滤器,以确保索引和搜索的准确性和效率。
在中文环境中,由于中文没有空格来分隔单词,所以针对中文文本,通常需要使用专门设计的中文分词器,例如Elasticsearch中的IK Analyzer。这样的分词器能够更好地理解中文文本的语义和结构,提高搜索的准确性。
说的简单点分词器就是将一句话中的词语划分出来。
二、分词器类别
(1)默认分词器
默认分词器只支持英文,并不支持中文的。
GET /_analyze {"text":测试语句, "analyzer":standard }举例: GET /_analyze {"text":"i am good boy","analyzer": "standard" }
(2)IK分词器
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。提供了两种分词算法:
ik_smart:最少切分
ik_max_word:最细粒度划分
注:在使用IK分词器一定要安装哦!这里有教程文章:IK分词器的安装
//测试ik分词器是否安装完成
GET /_analyze
{"text":"我是百战程序员","analyzer": "ik_max_word"
}
IK分词器词典介绍
IK分词器根据词典进行分词,词典文件在IK分词器的config目录中。
main.dic:IK中内置的词典。记录了IK统计的所有中文单词。
IKAnalyzer.cfg.xml:用于配置自定义词库。
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 ,然后自己创建该文件即可,表示的是可以允许符合规则的词汇--><entry key="ext_dict">ext_dict.dic</entry><!--用户可以在这里配置自己的扩展停止词字典,然后创建该文件即可,表示的是禁止的词汇--><entry key="ext_stopwords">ext_stopwords.dic</entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
(3)拼音分词器
拼音分词器可以将中文分成对应的全拼,全拼首字母等。比如有时候在搜索框中输入拼音也可以出现对应的一些目标。
拼音分词器的安装:拼音分词器的安装
GET /_analyze {"text":"我爱英雄联盟","analyzer": "pinyin" }
(4)自定义分词器
真实开发中我们往往需要对一段内容既进行文字分词,又进行拼音分词,此时我们需要自定义ik+pinyin分词器。
创建自定义分词器一定要在创建索引时就要创建!
PUT /索引名 {"settings" : {"analysis" : {"analyzer" : {"ik_pinyin" : { //自定义分词器名"tokenizer":"ik_max_word", // 基本分词器"filter":"pinyin_filter" // 配置分词器过滤}},"filter" : { // 分词器过滤时配置另一个分词器,相当于同时使用两个分词器"pinyin_filter" : { "type" : "pinyin", // 另一个分词器// 拼音分词器的配置,这些配置可以在github官网上查找"keep_separate_first_letter" : false, // 是否分词每个字的首字母"keep_full_pinyin" : true, // 是否分词全拼"keep_original" : true, // 是否保留原始输入"remove_duplicated_term" : true // 是否删除重复项}}}},"mappings":{"properties":{"域名1":{"type":域的类型,"store":是否单独存储,"index":是否创建索引,"analyzer":分词器},"域名2":{ ...}}} }
//具体的举例PUT /student3 {"settings": {"analysis": {"analyzer": {"ik_pinyin":{"tokenizer":"ik_max_word","filter":"pinyin_filter"}}, "filter": {"pinyin_filter":{"type":"pinyin","keep_separate_first_letter" : false, "keep_full_pinyin" : true, "keep_original" : true, "remove_duplicated_term" : true }}}},"mappings": {"properties": {"name":{"type": "text","analyzer": "ik_pinyin","store": true,"index": true},"age":{"type": "integer"}}} }
//测试GET /student3/_analyze {"text":"我是程序员","analyzer": "ik_pinyin" }