ElasticSearch之ICU分词器

分词器

分词器 接受一个字符串作为输入,将 这个字符串拆分成独立的词或 语汇单元(token) (可能会丢弃一些标点符号等字符),然后输出一个 语汇单元流(token stream) 。

一个analyzer分词器包含三个部分:

  • character filter:分词之前的预处理,过滤掉HTML标签、特殊符号转换等。
  • tokenizer:分词
  • token filter:标准化

ES内置分词器

事实上,ElasticSearch中有一些内置分词器:

  • Standard 分词器:默认分词器,会将词汇单元转成小写形式并且去除停用词和标点符号,支持中文采用的方法为单字切分。
  • Simple 分词器:首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式。该分词器会去除掉数字类型的字符。
  • Whitespace 分词器:仅仅是去除空格,对字符没有lowcase化,不支持中文;并且不对生成的词汇单元进行其他标准化处理。
  • Stop 分词器:相比Simple Analyzer多了去除请用词处理,停用词指语气助词等修饰性词语,如the, an, 的, 这等
  • Keyword 分词器:不分词,直接将输入作为一个单词输出
  • Pattern 分词器:通过正则表达式自定义分隔符,默认是\W+,即非字词的符号作为分隔符
  • Language 分词器:特定语言的分词器,不支持中文。如 english 、french 和 spanish 分析器。

应该说,standard 分词器是大多数西方语言分词的一个合理的起点。 事实上,它构成了大多数特定语言分析器的基础,如 english 、french 和 spanish 分析器。 它也支持亚洲语言,只是有些缺陷(=.=To Be Honest , 你输入任何中文,都会被拆成一个一个的文字来分词,简直不要太糟糕),你可以考虑通过 ICU 插件的方式使用 icu_analyzer 进行中文分词更合理。

附录有更详细的分词器列表。

分词API

作为REST的搜索引擎,ES可以直接 POST http://localhost:9200/_analyze 来查询分词的情况。

{
    "text": "I'm going to Guangzhou museum",
    "analyzer": "standard"
}
curl -X POST \
  http://localhost:9200/_analyze \
  -d '{
    "text": "I'\''m going to Guangzhou museum",
    "analyzer": "standard"
}'

curl或者postman都可以:

在这里插入图片描述
ICU 分析器插件

Elasticsearch的 ICU 分析器插件 使用 国际化组件 Unicode (ICU) 函数库提供丰富的处理 Unicode 工具。 这些包含对处理亚洲语言特别有用的 icu_分词器 ,还有大量对除英语外其他语言进行正确匹配和排序所必须的分词过滤器。

ICU 插件是处理英语之外语言的必需工具,非常推荐你安装并使用它,不幸的是,因为是基于额外的 ICU 函数库, 不同版本的ICU插件可能并不兼容之前的版本,当更新插件的时候,你需要重新索引你的数据(=。=根据你的ES版本替换后面的版本号,例如我是6.8.1,则用6.8.1,你用7.3.0就用7.3.0,类推)。

#自动安装
sudo bin/elasticsearch-plugin install analysis-icu
#手动安装
(自行下载)https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-icu/analysis-icu-6.8.1.zip
(Linux)sudo bin/elasticsearch-plugin install file:///path/to/plugin.zip
(Windows)bin\ elasticsearch-plugin.bat install file:///C:\Users\Administrator\Downloads\analysis-icu-6.8.1.zip
#安装成功
[=================================================] 100%??
-> Installed analysis-icu

ICU分词

{
    "text": "基于ELK打造强大的日志收集分析系统(springboot2+logback+logstash+elasticsearch+kibana)",
    "analyzer": "icu_analyzer"
}
{
    "tokens": [
        {
            "token": "基于",
            "start_offset": 0,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "elk",
            "start_offset": 2,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "打造",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "强大",
            "start_offset": 7,
            "end_offset": 9,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        },
        {
            "token": "的",
            "start_offset": 9,
            "end_offset": 10,
            "type": "<IDEOGRAPHIC>",
            "position": 4
        },
        {
            "token": "日志",
            "start_offset": 10,
            "end_offset": 12,
            "type": "<IDEOGRAPHIC>",
            "position": 5
        },
        {
            "token": "收集",
            "start_offset": 12,
            "end_offset": 14,
            "type": "<IDEOGRAPHIC>",
            "position": 6
        },
        {
            "token": "分析",
            "start_offset": 14,
            "end_offset": 16,
            "type": "<IDEOGRAPHIC>",
            "position": 7
        },
        {
            "token": "系统",
            "start_offset": 16,
            "end_offset": 18,
            "type": "<IDEOGRAPHIC>",
            "position": 8
        },
        {
            "token": "springboot2",
            "start_offset": 19,
            "end_offset": 30,
            "type": "<ALPHANUM>",
            "position": 9
        },
        {
            "token": "logback",
            "start_offset": 31,
            "end_offset": 38,
            "type": "<ALPHANUM>",
            "position": 10
        },
        {
            "token": "logstash",
            "start_offset": 39,
            "end_offset": 47,
            "type": "<ALPHANUM>",
            "position": 11
        },
        {
            "token": "elasticsearch",
            "start_offset": 48,
            "end_offset": 61,
            "type": "<ALPHANUM>",
            "position": 12
        },
        {
            "token": "kibana",
            "start_offset": 62,
            "end_offset": 68,
            "type": "<ALPHANUM>",
            "position": 13
        }
    ]
}

验证设想

{
    "text": "北京大学与解放军总医院第一附属医院妇产科",
    "analyzer": "icu_analyzer"
} 

之前有个设想:北京大学,分词器会分一个北京一个大学和一个北京大学
结果发现:太天真了,根本没有北京大学这个分词。。。。。。
请看下文结果

{
    "tokens": [
        {
            "token": "北京",
            "start_offset": 0,
            "end_offset": 2,
            "type": "<IDEOGRAPHIC>",
            "position": 0
        },
        {
            "token": "大学",
            "start_offset": 2,
            "end_offset": 4,
            "type": "<IDEOGRAPHIC>",
            "position": 1
        },
        {
            "token": "与",
            "start_offset": 4,
            "end_offset": 5,
            "type": "<IDEOGRAPHIC>",
            "position": 2
        },
        {
            "token": "解放",
            "start_offset": 5,
            "end_offset": 7,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        },
        {
            "token": "军",
            "start_offset": 7,
            "end_offset": 8,
            "type": "<IDEOGRAPHIC>",
            "position": 4
        },
        {
            "token": "总",
            "start_offset": 8,
            "end_offset": 9,
            "type": "<IDEOGRAPHIC>",
            "position": 5
        },
        {
            "token": "医院",
            "start_offset": 9,
            "end_offset": 11,
            "type": "<IDEOGRAPHIC>",
            "position": 6
        },
        {
            "token": "第一",
            "start_offset": 11,
            "end_offset": 13,
            "type": "<IDEOGRAPHIC>",
            "position": 7
        },
        {
            "token": "附属",
            "start_offset": 13,
            "end_offset": 15,
            "type": "<IDEOGRAPHIC>",
            "position": 8
        },
        {
            "token": "医院",
            "start_offset": 15,
            "end_offset": 17,
            "type": "<IDEOGRAPHIC>",
            "position": 9
        },
        {
            "token": "妇产科",
            "start_offset": 17,
            "end_offset": 20,
            "type": "<IDEOGRAPHIC>",
            "position": 10
        }
    ]
}

Smart Chinese Analyzer Plugins

中文分词器,听说Elastic Stack 8.0会自带,但是还没release,静候佳音吧。

Smart Chinese Analysis插件将Lucene的Smart Chinese分析模块集成到elasticsearch中。

提供中文或混合中英文本的分析器。 该分析器使用概率知识来查找简体中文文本的最佳分词。 首先将文本分成句子,然后将每个句子分割成单词。

sudo bin/elasticsearch-plugin install analysis-smartcn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章