Elasticsearch Analyzer原理分析并实现中文分词
首先,我们知道倒排索引的原理,我们需要构建一个单词词典,但是这个词典里面的数据怎么来呢?我们需要对输入的东西进行分词。这个ES
已经考虑过了,所以它内置了一些分词器,但是中国文化,博大精深
,有时候自己断句都会有误差,所以我们会用一些国人的插件进行中文分词。这篇文章的重点也就是介绍ES
分词原理、内置分词和中文分词。
ES分词是如何实现?
Analysis(分析)
是通过Analyzer(分析器)
实现的,分析也是有步骤的,所以我们说一下Analyzer
的组成。
分词器主要由三部分组成:
-
Character Filters 字符过滤器 比方说
剔除html代码
、特殊符号
等等,可以有多个字符过滤器 -
Tokenizer 分词器 对语句进行
分词
,只能有一个 -
Token Filter token过滤器 对词
进行过滤
、或者转小写
、等等,可以有多个token filter,依次执行
ES内置分词器分析
我们知道了分词器的组成,只需要再知道它的一些实现即可。我们也列出来方便查看
- standard
默认的分词器,按词分类并且小写处理。这个我们举个例子,其余大家照葫芦画瓢就行
我这里是利用Kibana
的dev tool
进行api
调试,大家也可以用postman
等工具进行测试。ES
提供_analyze api
来测试分词。
GET _analyze
{
"analyzer": "standard", # 分词器
"text": "The quick brown fox." # 输入的语句
}
- simple
安照非字母切分,不是字母就剔除了,包括标点符号数字等,并对单词进行小写处理
- stop
对输入进行小写处理,并将停用词过滤,例如这些单词(the,a, is)
- whitespace
按空格切分
- keyword
不分词,当成一整个 term
输出
- pattern
通过正则表达式进行分词,默认是 W+(非字母进行分隔)
- Language
举个例子按英文拆分,它支持不同的语言,例如:arabic, armenian, basque, bengali, bulgarian, catalan, czech, dutch, english, finnish, french, galician, german, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian, portuguese, romanian, russian, sorani, spanish, swedish, turkish.
#english
GET _analyze
{
"analyzer": "english",
"text": "I'm Aoppp 憧憬"
}
上面例子典型对中文就不太友好,中文分词要比英文分词难,英文都以空格分隔,中文理解通常需要上下文理解才能有正确的理解,比如 [苹果,不大好吃]和[苹果,不大,好吃],这两句意思就不一样。
中文分词
这个中文分词插件也不少,我也列举一些给大家。
- analysis-icu
地址:https://github.com/elastic/elasticsearch-analysis-icu
直接安装就行 bin/plugin install analysis-icu
- analysis-ik
地址:https://github.com/medcl/elasticsearch-analysis-ik
IK Analysis
插件将Lucene IK
分析器集成到elasticsearch
中,支持自定义词典。
- elasticsearch-thulac-plugin
地址:https://github.com/microbun/elasticsearch-thulac-plugin
THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。
这里的话ik
还不错,可以自定义词典等等,我来用它举个例子吧
安装
这里我的ES
是7.6的,你们要安装对应版本改一下就行
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.0/elasticsearch-analysis-ik-7.6.0.zip
安装完成重启一下ES
效果
GET _analyze
{
"analyzer": "ik_max_word", # 穷进可能
"text": "这是憧憬的技术分享博客啊"
}
比因为的单字拆分还是漂亮。
- javascript console输出图片?
- 快速搭建Storm集群环境
- OpenCV中BLOB特征提取与几何形状分类
- OpenCV实现照片自动红眼去除
- OpenCV3.1.0级联分类器训练与使用
- 图像处理之理解Homography matrix(单应性矩阵)
- OpenCV中图像直方图与应用
- OpenCV中图像修复技术介绍与演示
- 44个Java代码性能优化总结
- LDA(Linear Discriminant Analysis)算法介绍
- Express.js 4,Node.js,MongoDB REST API 简易教程
- 基于梯度下降算法求解线性回归
- 彩色图像高斯反向投影
- OpenCV中直方图反向投影算法详解与实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux笔记【003】| Linux系统目录结构与基本命令
- codeforces1322A(括号匹配)
- codeforces 1296D(贪心)
- codeforces 1399D
- JSP开发之JSTL介绍和使用
- codeforces 1283E(贪心)
- codeforces1216C (矩形面积交)
- codeforces 1234C(思维)
- codeforces 1405B(思维)
- codeforces 1216D(数学)
- codeforces 1256D(优先队列+贪心)
- codeforces 1343D(差分数组)
- codeforces1385D (递归+分治)
- codeforces1294D(思维+暴力)
- codeforces 1367D(思维)