1. 分词和分词器

  • Analysis 分词:把全文本转换成一系列单词
  • Analyzer 是通过 Analyzer 来实现的
    • 可使用 ElasticSearch 内置的分析器,或按需定制化分析器
  • 除了在数据写入时转换词条,匹配 Query 语句时也需要用相同的分析器对查询语句进行分析

2. 分词器的组成

组成 功能
Character Filters 针对原始文本进行处理,比如去除 html 标记符
Tokenizer 将原始文本按照一定规则切分为单词
Token Filters 针对切分的单词进行加工,比如转为小写、删除 stopwords、增加同义词
  • 分词器组成的调用是有顺序的:

分词器 - 图1

3. Analyze API

es 提供了一个测试分词的 api 接口,方便验证分词效果,endpoint 是 _analyze;
这个 api 具有以下特点:

  • 可以直接指定 analyzer 进行测试;
  • 可以直接指定索引中的字段进行测试;
  • 可以自定义分词器进行测试;

    3.1 直接指定analyzer进行测试

    1. POST _analyze
    2. {
    3. "analyzer": "standard",
    4. "text": "hello world"
    5. }
    analyzer 表示指定的分词器,这里使用 es 自带的分词器 standard,text 用来指定待分词的文本。
    分词器 - 图2
    从结果中可以看到,分词器将文本分成了 hello 和 world 两个单词。

3.2 指定索引中的字段进行测试

应用场景:当创建好索引后发现某一字段的查询和预期不一样,就可以对这个字段进行分词测试。

  1. POST text_index/_analyze
  2. {
  3. "field": "username",
  4. "text": "hello world"
  5. }

分词器 - 图3
当没有指定分词器的时候默认使用 standard。

3.3 自定义分词器进行测试

  1. POST _analyze
  2. {
  3. "tokenizer": "standard",
  4. "filter": [ "lowercase" ],
  5. "text": "Hello World"
  6. }

根据分词的流程,首先通过 tokenizer 指定的分词方法 standard 进行分词,然后会经过 filter 将大写转化为小写。
分词器 - 图4

4. ES 的内置分词器

4.1 Standard Analyzer

默认分词器,具有按词切分、支持多语言、小写处理的特点。
分词器 - 图5
可以看到,standerd 将 stop word 默认关闭了,也就是这些词还是会在分词后保留。
stop word 就是例如 and、the、or 这种词,可以通过配置将它打开。其实搜索引擎应该将这些 stop word 过滤掉,这样可以减少压力的同时保证搜索的准确性。

4.2 Simple Analyzer

具有特性是:按照非字母切分(数字,符号被过滤掉)、小写处理。
分词器 - 图6
可以看到它将非字母的字符切掉了,例如横线、标点、数字都被干掉了。

4.3 Whitespace Analyzer

具有的特性是:按照空格切分,不转小写。
分词器 - 图7
可以看到它按照空格切分,并且没有进行小写转化。

4.4 Stop Analyzer

具有的特性是:将 stop word 停用词过滤掉,小写处理。
分词器 - 图8

4.5 Keyword Analyzer

具有的特性是:不分词,直接将输入作为一个单词输出;
分词器 - 图9

4.6 Pattern Analyzer

具有的特性是:通过正则表达式自定义分隔符,默认是 \W+,即非字词的符号作为分隔符,小写转化 。
分词器 - 图10

4.7 Language Analyzer

具有的特性是:提供了 30+ 常见语言的分词器。

5. 中文分词器

中文分词是指讲一个汉字序列切分成一个一个独立的词。在英文中,单词间以空格作为自然分界符,汉语中词没有一个形式上的分界符。

而且根据上下文的不同,分析结果迥异。

5.1 常见中文分词器

  • IK
    • 可以实现中英文单词的分词,支持ik_smart、ik_maxword等模式;可以自定义词库,支持热更新分词词典。
  • jieba
    • python中最流行的分词系统,支持分词和词性标注;支持繁体分词、自定义词典、并行分词。

基于自然语言的分词系统:
这种分词系统可以通过创建一个模型,然后该模型经过训练可以通过根据上下文进行合理的分词,常见的有:

  • Hanlp
    • 有一系列模型预算法组成的 Java 工具包,目标是普及自然语言处理在生产环境中的应用。
  • THULAC
    • 清华大学推出,具有中文分词和词性标注的功能。