ElasticSearch最全分词器比较及使用方法

您所在的位置:网站首页 help的分词 ElasticSearch最全分词器比较及使用方法

ElasticSearch最全分词器比较及使用方法

2024-06-29 12:45:02| 来源: 网络整理| 查看: 265

介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口。Elasticsearch 是用 Java 开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch中,内置了很多分词器(analyzers)。下面来进行比较下系统默认分词器和常用的中文分词器之间的区别。

系统默认分词器: 1、standard 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html

如何使用:http://www.yiibai.com/lucene/lucene_standardanalyzer.html

英文的处理能力同于StopAnalyzer.支持中文采用的方法为单字切分。他会将词汇单元转换成小写形式,并去除停用词和标点符号。

/**StandardAnalyzer分析器*/ public void standardAnalyzer(String msg){ StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36); this.getTokens(analyzer, msg); } 2、simple 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-simple-analyzer.html

如何使用: http://www.yiibai.com/lucene/lucene_simpleanalyzer.html

功能强于WhitespaceAnalyzer, 首先会通过非字母字符来分割文本信息,然后将词汇单元统一为小写形式。该分析器会去掉数字类型的字符。

/**SimpleAnalyzer分析器*/ public void simpleAnalyzer(String msg){ SimpleAnalyzer analyzer = new SimpleAnalyzer(Version.LUCENE_36); this.getTokens(analyzer, msg); } 3、Whitespace 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-whitespace-analyzer.html

如何使用:http://www.yiibai.com/lucene/lucene_whitespaceanalyzer.html

仅仅是去除空格,对字符没有lowcase化,不支持中文; 并且不对生成的词汇单元进行其他的规范化处理。

/**WhitespaceAnalyzer分析器*/ public void whitespaceAnalyzer(String msg){ WhitespaceAnalyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36); this.getTokens(analyzer, msg); } 4、Stop 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-stop-analyzer.html

如何使用:http://www.yiibai.com/lucene/lucene_stopanalyzer.html

StopAnalyzer的功能超越了SimpleAnalyzer,在SimpleAnalyzer的基础上增加了去除英文中的常用单词(如the,a等),也可以更加自己的需要设置常用单词;不支持中文

/**StopAnalyzer分析器*/ public void stopAnalyzer(String msg){ StopAnalyzer analyzer = new StopAnalyzer(Version.LUCENE_36); this.getTokens(analyzer, msg); } 5、keyword 分词器

KeywordAnalyzer把整个输入作为一个单独词汇单元,方便特殊类型的文本进行索引和检索。针对邮政编码,地址等文本信息使用关键词分词器进行索引项建立非常方便。

6、pattern 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-pattern-analyzer.html

一个pattern类型的analyzer可以通过正则表达式将文本分成"terms"(经过token Filter 后得到的东西 )。接受如下设置:

一个 pattern analyzer 可以做如下的属性设置:

lowercaseterms是否是小写. 默认为 true 小写.pattern正则表达式的pattern, 默认是 \W+.flags正则表达式的flagsstopwords一个用于初始化stop filter的需要stop 单词的列表.默认单词是空的列表

7、language 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html

一个用于解析特殊语言文本的analyzer集合。( arabic,armenian, basque, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english, finnish, french,galician, german, greek, hindi, hungarian, indonesian, irish, italian, latvian, lithuanian, norwegian,persian, portuguese, romanian, russian, sorani, spanish, swedish, turkish, thai.)可惜没有中文。不予考虑

8、snowball 分词器

一个snowball类型的analyzer是由standard tokenizer和standard filter、lowercase filter、stop filter、snowball filter这四个filter构成的。

snowball analyzer 在Lucene中通常是不推荐使用的。

9、Custom 分词器

是自定义的analyzer。允许多个零到多个tokenizer,零到多个 Char Filters. custom analyzer 的名字不能以 "_"开头.

The following are settings that can be set for a custom analyzer type:

SettingDescriptiontokenizer通用的或者注册的tokenizer.filter通用的或者注册的token filterschar_filter通用的或者注册的 character filtersposition_increment_gap距离查询时,最大允许查询的距离,默认是100

自定义的模板:

index : analysis : analyzer : myAnalyzer2 : type : custom tokenizer : myTokenizer1 filter : [myTokenFilter1, myTokenFilter2] char_filter : [my_html] position_increment_gap: 256 tokenizer : myTokenizer1 : type : standard max_token_length : 900 filter : myTokenFilter1 : type : stop stopwords : [stop1, stop2, stop3, stop4] myTokenFilter2 : type : length min : 0 max : 2000 char_filter : my_html : type : html_strip escaped_tags : [xxx, yyy] read_ahead : 1024 10、fingerprint 分词器

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-fingerprint-analyzer.html

中文分词器: 1、ik-analyzer

https://github.com/wks/ik-analyzer

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。

采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;具有83万字/秒(1600KB/S)的高速处理能力。

采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符

优化的词典存储,更小的内存占用。支持用户词典扩展定义

针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);引入简单搜索表达式,采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

Maven用法:

org.wltea.ik-analyzer ik-analyzer 3.2.8

在IK Analyzer加入Maven Central Repository之前,你需要手动安装,安装到本地的repository,或者上传到自己的Maven repository服务器上。

要安装到本地Maven repository,使用如下命令,将自动编译,打包并安装: mvn install -Dmaven.test.skip=true

Elasticsearch添加中文分词

安装IK分词插件

https://github.com/medcl/elasticsearch-analysis-ik

进入elasticsearch-analysis-ik-master

更多安装请参考博客:

1、为elastic添加中文分词: http://blog.csdn.net/dingzfang/article/details/42776693

2、如何在Elasticsearch中安装中文分词器(IK+pinyin):http://www.cnblogs.com/xing901022/p/5910139.html

3、Elasticsearch 中文分词器 IK 配置和使用: http://blog.csdn.net/jam00/article/details/52983056

ik 带有两个分词器

ik_max_word:会将文本做最细粒度的拆分;尽可能多的拆分出词语

ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

区别:

# ik_max_word curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d '联想是全球最大的笔记本厂商' #返回 { "tokens" : [ { "token" : "联想", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "是", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 1 }, { "token" : "全球", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "最大", "start_offset" : 5, "end_offset" : 7, "type" : "CN_WORD", "position" : 3 }, { "token" : "的", "start_offset" : 7, "end_offset" : 8, "type" : "CN_CHAR", "position" : 4 }, { "token" : "笔记本", "start_offset" : 8, "end_offset" : 11, "type" : "CN_WORD", "position" : 5 }, { "token" : "笔记", "start_offset" : 8, "end_offset" : 10, "type" : "CN_WORD", "position" : 6 }, { "token" : "本厂", "start_offset" : 10, "end_offset" : 12, "type" : "CN_WORD", "position" : 7 }, { "token" : "厂商", "start_offset" : 11, "end_offset" : 13, "type" : "CN_WORD", "position" : 8 } ] } # ik_smart curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_smart' -d '联想是全球最大的笔记本厂商' # 返回 { "tokens" : [ { "token" : "联想", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "是", "start_offset" : 2, "end_offset" : 3, "type" : "CN_CHAR", "position" : 1 }, { "token" : "全球", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "最大", "start_offset" : 5, "end_offset" : 7, "type" : "CN_WORD", "position" : 3 }, { "token" : "的", "start_offset" : 7, "end_offset" : 8, "type" : "CN_CHAR", "position" : 4 }, { "token" : "笔记本", "start_offset" : 8, "end_offset" : 11, "type" : "CN_WORD", "position" : 5 }, { "token" : "厂商", "start_offset" : 11, "end_offset" : 13, "type" : "CN_WORD", "position" : 6 } ] }

下面我们来创建一个索引,使用 ik 创建一个名叫 iktest 的索引,设置它的分析器用 ik ,分词器用 ik_max_word,并创建一个 article 的类型,里面有一个 subject 的字段,指定其使用 ik_max_word 分词器

curl -XPUT 'http://localhost:9200/iktest?pretty' -d '{ "settings" : { "analysis" : { "analyzer" : { "ik" : { "tokenizer" : "ik_max_word" } } } }, "mappings" : { "article" : { "dynamic" : true, "properties" : { "subject" : { "type" : "string", "analyzer" : "ik_max_word" } } } } }'

批量添加几条数据,这里我指定元数据 _id 方便查看,subject 内容为我随便找的几条新闻的标题

curl -XPOST http://localhost:9200/iktest/article/_bulk?pretty -d ' { "index" : { "_id" : "1" } } {"subject" : ""闺蜜"崔顺实被韩检方传唤 韩总统府促彻查真相" } { "index" : { "_id" : "2" } } {"subject" : "韩举行"护国训练" 青瓦台:决不许国家安全出问题" } { "index" : { "_id" : "3" } } {"subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮" } { "index" : { "_id" : "4" } } {"subject" : "村上春树获安徒生奖 演讲中谈及欧洲排外问题" } { "index" : { "_id" : "5" } } {"subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”" } '

查询 “希拉里和韩国”

curl -XPOST http://localhost:9200/iktest/article/_search?pretty -d' { "query" : { "match" : { "subject" : "希拉里和韩国" }}, "highlight" : { "pre_tags" : [""], "post_tags" : [""], "fields" : { "subject" : {} } } } ' #返回 { "took" : 113, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 4, "max_score" : 0.034062363, "hits" : [ { "_index" : "iktest", "_type" : "article", "_id" : "2", "_score" : 0.034062363, "_source" : { "subject" : "韩举行"护国训练" 青瓦台:决不许国家安全出问题" }, "highlight" : { "subject" : [ "韩举行"护国训练" 青瓦台:决不许国家安全出问题" ] } }, { "_index" : "iktest", "_type" : "article", "_id" : "3", "_score" : 0.0076681254, "_source" : { "subject" : "媒体称FBI已经取得搜查令 检视希拉里电邮" }, "highlight" : { "subject" : [ "媒体称FBI已经取得搜查令 检视希拉里电邮" ] } }, { "_index" : "iktest", "_type" : "article", "_id" : "5", "_score" : 0.006709609, "_source" : { "subject" : "希拉里团队炮轰FBI 参院民主党领袖批其“违法”" }, "highlight" : { "subject" : [ "希拉里团队炮轰FBI 参院民主党领袖批其“违法”" ] } }, { "_index" : "iktest", "_type" : "article", "_id" : "1", "_score" : 0.0021509775, "_source" : { "subject" : ""闺蜜"崔顺实被韩检方传唤 韩总统府促彻查真相" }, "highlight" : { "subject" : [ ""闺蜜"崔顺实被韩检方传唤 韩总统府促彻查真相" ] } } ] } }

这里用了高亮属性 highlight,直接显示到 html 中,被匹配到的字或词将以红色突出显示。若要用过滤搜索,直接将 match 改为 term 即可

热词更新配置

网络词语日新月异,如何让新出的网络热词(或特定的词语)实时的更新到我们的搜索当中呢

先用 ik 测试一下

curl -XGET 'http://localhost:9200/_analyze?pretty&analyzer=ik_max_word' -d ' 成龙原名陈港生 ' #返回 { "tokens" : [ { "token" : "成龙", "start_offset" : 1, "end_offset" : 3, "type" : "CN_WORD", "position" : 0 }, { "token" : "原名", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 1 }, { "token" : "陈", "start_offset" : 5, "end_offset" : 6, "type" : "CN_CHAR", "position" : 2 }, { "token" : "港", "start_offset" : 6, "end_offset" : 7, "type" : "CN_WORD", "position" : 3 }, { "token" : "生", "start_offset" : 7, "end_offset" : 8, "type" : "CN_CHAR", "position" : 4 } ] }

ik 的主词典中没有”陈港生” 这个词,所以被拆分了。 现在我们来配置一下

修改 IK 的配置文件 :ES 目录/plugins/ik/config/ik/IKAnalyzer.cfg.xml

修改如下:

IK Analyzer 扩展配置 custom/mydict.dic;custom/single_word_low_freq.dic custom/ext_stopword.dic http://192.168.1.136/hotWords.php

这里我是用的是远程扩展字典,因为可以使用其他程序调用更新,且不用重启 ES,很方便;当然使用自定义的 mydict.dic 字典也是很方便的,一行一个词,自己加就可以了

既然是远程词典,那么就要是一个可访问的链接,可以是一个页面,也可以是一个txt的文档,但要保证输出的内容是 utf-8 的格式

hotWords.php 的内容

$s =


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭