Elasticsearch中文分词研究

一、ES分析器简介


ES是一个实时搜索与数据分析引擎,为了完成搜索功能,必须对原始数据进行分析、拆解,以建立索引,从而实现搜索功能;


ES对数据分析、拆解过程如下:




首先,将一块文本分成适合于倒排索引的独立的 词条;
之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall




实际执行上面分析工作的,既是ES的分析器;


ES 分析器实际包含三部分功能:


1.字符过滤器:


字符过滤器是用来整理一个尚未被分词的字符串。例如:如果我们的文本那是HTML格式的,他会包含像<p>或者<div>这样的HTML标签,这些标签是我们不想索引的,我们可以使用html清除这个字符过滤器来移除所有的HTML标签,并且像把Á转换为相对应的Unicode字符Á这样,转换HTML实体。


一个分析器可以有0或多个字符过滤器。


2.分词器:


一个分析器必须有一个唯一的分词器。分词器把字符串分解成单个词条或者词汇单元。比如空格分词器会把字符串按空格来切分成词单元:如字符串“The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.”经过空格分词器分词后,会变为如下词单元【The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone.】


3.词单元过滤器:


经过分词,作为结果的 ‘词单元流’ 会按照指定的顺序通过指定的词单元过滤器。词单元过滤器可以修改、添加或者移词单元。比如lowercase语汇单元过滤器,会转换所有的语汇单元为小写:如词单元“We”经过lowercase语汇单元过滤器过滤后,会变为“we”。




二、ES中文分析器


ES内置了一些分析器,其中支持对中文进行分词的分析器有:




StandardAnalyzer:单字分析器 - 支持中文分词,但只是按照单个的汉字进行了分词,如“我是中国人”,分词后,词单元为【“我”  “是”  “中”  “国”  “人”】
CJKAnalyzer:二分法分析器 - 按照两个两个一组的形式对汉字进行了分词,如“我是中国人”,分词后,词单元为【“我是”  “是中”  “中国”  “国人”】




从上面可以看出,这两个分析器其实对中文的分词都不够理想,对此,ES推荐了一款对亚洲语言特别好用的分析器:ICU 分析器;然而对中文分词来说,最有效的分析器是IK分析器,IK分析器采用词库分词方法,即按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语,词库分词法是目前被认为最理想的中文分词算法。




三、IK分析器


IK分析器官网:https://github.com/medcl/elasticsearch-analysis-ik


从官网可以了解到,目前IK分析器有两款:ik_max_word 和 ik_smart:




ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。






四、IK分析器搭建


搭建elasticsearch-analysis-ik


ElasticSearch版本:6.2.3,是否集群:否,服务器: 192.168.9.214


安装过程:




安装ElasticSearch
安装ElasticSearch插件elasticsearch-analysis-ik




# 切换到www账号,ES不能使用root账号启动,否则会报错
su - www


# 下载ElasticSearch
cd /usr/local/elk
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.3.zip
unzip elasticsearch-6.2.3.zip


# 启动ES
cd /usr/local/elk/elasticsearch-6.2.3
bin/elasticsearch -d


##########################################
# 安装elasticsearch-analysis-ik(方式1)
##########################################


# 使用`bin/elasticsearch-plugin install`命令安装
cd /usr/local/elk/elasticsearch-6.2.3
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.3/elasticsearch-analysis-ik-6.2.3.zip


# 重启ES(此处较为血腥,生产环境勿用)
killall java
bin/elasticsearch -d


##########################################
# 安装elasticsearch-analysis-ik(方式2) -- 实践可行
##########################################


# 下载
cd /usr/local/elk/elasticsearch-6.2.3/plugins
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.2.3/elasticsearch-analysis-ik-6.2.3.zip
upzip elasticsearch-analysis-ik-6.2.3.zip && rm -rf elasticsearch-analysis-ik-6.2.3.zip


# 重启ES(此处较为血腥,生产环境勿用)
killall java
bin/elasticsearch -d




五、IK分析器应用


待补充




附:参考资料

- [ES分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/analysis-intro.html)
- [ES自定义分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/custom-analyzers.html)
- [ES配置分析器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/configuring-analyzers.html)
- [ES标准分词器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/standard-tokenizer.html)
- [ICU简介](https://www.elastic.co/guide/cn/elasticsearch/guide/current/icu-plugin.html)
- [ICU分词器](https://www.elastic.co/guide/cn/elasticsearch/guide/current/icu-tokenizer.html)

- [什么是倒排索引](http://www.cnblogs.com/zlslch/p/6440114.html)


附一:ElasticSearch 与 solr 对比

- [搜索引擎选型调研文档](https://www.cnblogs.com/chowmin/articles/4629220.html)


- [ElasticSearch vs Solr多维度分析对比](https://blog.csdn.net/gaowenhui2008/article/details/78189627)


附二:ElasticSearch能否替换数据库

问题提出


使用ES做搜索引擎,数据需要向ES输入一份,ES接收到数据后,会对数据建立索引,同时会存下完整的数据信息;


用户通过ES搜索时,是检索的ES的索引,数据也是直接从ES中取得,不需要到数据库中再取一遍,所以感觉有些场景下,数据库好像没必要存在,有ES就可以了。




分析


待完善


没有花时间具体分析比较,大概就是:


ES作为主数据库时,在访问控制和数据污染控制方面,不如专门的DB;另外ES是分布式存储,数据是分散的,进行关联性操作时,会很麻烦(但是可以实现);


如果能够容忍上面的问题,使用ES做主数据库,理论上是没有问题的;


参考了一篇详细分析ES和NoSql的文章:[ElasticSearch学习4_把 ElasticSearch 当成是 NoSQL 数据库](https://blog.csdn.net/wang_zhenwei/article/details/50177171),比较推荐的做法是:“Elasticsearch通常被用作其它数据库的补充。那样的数据库系统要有强大的数据约束保证、容错性和鲁棒性、高可用性和带事务支持的数据更新能力,它维护着核心数据 - 这些数据随后会被异步推送到Elasticsearch中去(也可能是抽取,前提是你使用了Elasticsearch的某一种“rivers”)”






### 参考


- [ES官方 - Elasticsearch as a NoSQL Database](https://www.elastic.co/blog/found-elasticsearch-as-nosql)
- [ES官方 - NoSQL, Yes Search](https://www.elastic.co/blog/no-sql-yes-search)
- [ElasticSearch学习4_把 ElasticSearch 当成是 NoSQL 数据库](https://blog.csdn.net/wang_zhenwei/article/details/50177171)
- [elasticsearch(lucene)可以代替NoSQL(mongodb)吗?](https://www.zhihu.com/question/25535889)
- [ElasticSearch 和 Mysql 配合使用的话,同一份数据是不是必须在 ElasticSearch 和 Mysql 各存一份?](https://ruby-china.org/topics/25606?locale=en)
- [elasticsearch 可以替代数据库吗](https://zhidao.baidu.com/question/1434259038397205099.html)
- [可否完全使用ElasticSearch代替数据库存储?](https://www.zhihu.com/question/45510463?sort=created)
- [Elasticsearch为什么不适合做数据库](https://elasticsearch.cn/question/2139)
- [Elasticsearch关联关系处理](https://www.elastic.co/guide/cn/elasticsearch/guide/current/relations.html)
- [谈谈Elasticsearch 和 传统关系型数据库的对比](http://f.dataguru.cn/thread-607540-1-1.html)
- [elasticsearch可以代替NoSQL吗](https://zhidao.baidu.com/question/1863108917081182747.html)
- [Elasticsearch、MongoDB和Hadoop比较](https://www.jianshu.com/p/2c7b0c76fa04)




没有更多推荐了,返回首页