| 分词器 | 使用层面 | 主要用途 | 特点 |
|---|---|---|---|
| ik_smart | Elasticsearch 查询 | 商品搜索、查询匹配 | 粗粒度,搜索召回 |
| ik_max_word | Elasticsearch 索引 | 文本字段索引 | 细粒度,全面覆盖 |
| Jieba | Java 应用层 | 关键词提取、分词服务 | 支持自定义词典 |
| HanLP | Java 应用层 | 词性标注 | 语义分析 |
分词器的主要作用是将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具。
顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在 ES 中,Analysis 是通过分词器(Analyzer)来实现的,可使用 ES 内置的分析器或者按需定制化分析器。
举一个分词简单的例子:比如你输入 Mastering Elasticsearch,会自动帮你分成两个单词,一个是 mastering,另一个是 elasticsearch,可以看出单词也被转化成了小写的。
分词器是专门处理分词的组件,由以下三部分组成:
| 组成部分 | 描述 |
|---|---|
| character filter | 接收原字符流,通过添加、删除或者替换操作改变原字符流。例如:去除文本中的html标签,或者将罗马数字转换成阿拉伯数字等。一个字符过滤器可以有零个或者多个 |
| tokenizer | 简单的说就是将一整段文本拆分成一个个的词。例如拆分英文,通过空格能将句子拆分成一个个的词,但是对于中文来说,无法使用这种方式来实现。在一个分词器中,有且只有一个 tokenizeer |
| token filters | 将切分的单词添加、删除或者改变。例如将所有英文单词小写,或者将英文中的停词a删除等,在token filters中,不允许将token(分出的词)的position或者offset改变。同时,在一个分词器中,可以有零个或者多个token filters |
Analyzer 三个部分的执行顺序依次为:Character Filters → Tokenizer → Token Filters。
这个顺序比较好理解:一个文本进来先对文本数据进行处理,再进行分词,最后对分词结果进行过滤。
文本分词会发生在两个地方:
创建索引:当索引文档字符类型为text时,在建立索引时将会对该字段进行分词。搜索:当对一个text类型的字段进行全文检索时,会对用户输入的文本进行分词。