Loading...
墨滴

可爱猪猪

2021/05/27  阅读:52  主题:默认主题

细嚼慢咽Elasticsearch的分词器,还是蛮有意思的

最近工作中,需要对抓取的文章标题和内容进行检索,Elasticsearch的分词器为我们提供了极大的便利。那么如何在项目中正确使用中文分词器呢?

分词器组件

一个分词器(官方称Analyzer)不管是内置的还是自定义的, 都应该是一个包含了三个层级模块:

  • character filter(字符过滤器)
  • tokenizer(分词器)
  • token filter(分词过滤器)

分词器是一个Stream或者Piple模式,对输入流进行过滤和切割:

  • character filter:负责原始文本输入流进行处理,可以在原始文本CURD字符串。比如去除多余的HTML标签
  • tokenizer:将字符过滤器处理过的文本分割成独立的词语。比如空格分词器,将I LOVE YOU分割为3个单词
  • token filter:完成分词后,可以对分词的结果进行过滤,比如转小写、去除语气词等。

官方自带的分词器

Elasticsearch内置众多分词器,比如:
Standard Analyzer: 按词切分、转小写、移除停顿词
Simple Analyzer: 非字母切分(单个字母会被过滤),也会转小写
Whitespace Analyzer:按空格切分,不会转小写 此外,还有5个内置分词器Stop AnalyzerKeyword AnalyzerPattern AnalyzerLanguage AnalyzerFingerprint Analyzer


但是,这些分词器都缺少的中国味道~~~

GET http://localhost:9200/_analyze
content-type: application/json

{
    "text":"我是一个中国人"
}

被分词为一个一个汉字:





中文分词器

IK分词器是一个中文分词器,但是需要安装Ik分词器插件,再来测试一下:

GET http://localhost:9200/_analyze
content-type: application/json

{
    "analyzer":"ik_smart",
    "text":"我是一个中国人"
}

分词结果:


一个
中国人

ik分词器的分词类型

ik_max_word:会将文本做最细粒度的拆分,比如会将“我是中国人”拆分为“我,是,一个,一个中国,一,个中,个,中国人,中国,国人”,会穷尽各种可能的组合;

ik_smart:会做最粗粒度的拆分,跟上述执行的结果一致。

可爱猪猪

2021/05/27  阅读:52  主题:默认主题

作者介绍

可爱猪猪