商务服务
ElasticSearch 启动时加载 Analyzer 源码分析
2024-11-02 23:02

本文介绍 ElasticSearch启动时如何创建、加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档介绍、ElasticSearch6.3.2源码中相关类:AnalysisModule、AnalysisPlugin、AnalyzerProvider、各种Tokenizer类和它们对应的TokenizerFactory。另外还参考了一个具体的基于ElasticSearch采用HanLP进行中文分词的插件:elasticsearch-analysis-hanlp

ElasticSearch 启动时加载 Analyzer 源码分析

这篇文章的主要目的是搞懂:AnalysisModule、AnalysisPlugin、AnalyzerProvider、某个具体的Tokenizer,比如HanLPStandardAnalyzer、和TokenizerFactory 之间的关系。这里面肯定是用过了某个(某些)设置模式的。搞懂了这个自己也能照葫芦画瓢,开发自定义的Plugin了。

1 Tokenizer

对比HanLP中文分词器和ElasticSearch中内置的标准分词器(StandardTokenizer),发现elasticsearch-analysis-hanlp的实现方法和ElasticSearch中实现的标准分词插件二者几乎是一个套路。

HanLP提供了各种各样的中文分词方式,比如:标准分词、索引分词、NLP分词……因此, implements ,实现了方法,负责创建各类分词器。

这种写法和ElasticSearch源码里面的写法如出一辙。

2 Analyzer

把Analyzer想象成一部生产Token的机器,输入Text,输出Token。

An Analyzer builds TokenStreams, which analyze text. It thus represents a policy for extracting index terms from text.

这部机器可以以不同的方式生产Token。比如:对于英文,一般以文本中的空格作为分隔符,输入Text,输出Token。

对于中文,中文文本没有空格了,因此需要借助一些中文分词算法,输入Text,输出Token。

对于HTML这样的文本,那就需要根据HTML标签作为分隔符,输入Text,输出Token。

内部类封装了生产Token的方式,看源码注释**This class encapsulates the outer components of a token stream.It provides access to the source Tokenizer and .... **。主要是封装了Tokenizer

若要自定义Analyzer,只需继承Analyzer类,重写方法,提供一个Tokenizer就可以了。比如:重写的方法如下:

另外,也可参考ElasticSearch中提供的,它实现了ElasticSearch查询分析过程中的标准分词,它继承了,这样可以在生产Token的时候,过滤掉 stop words。

3 AnalyzerProvider

AnalyzerProvider封装了Analyzer,它的构造方法实例化一个Analyzer,并为Analyzer 提供了一些名称、版本相关的信息:

里面有 name 和 Version信息(Constructs a new analyzer component, with the index name and its settings and the analyzer name.)

4 AnalysisPlugin

负责注册各种各样的分词器。在定义索引的时候需要指定某个字段的Analyzer名称,比如下面 name 字段中的文本在都使用名称为分词器分词后,写入ElasticSearch索引。

主要是下面三个方法,用来获取:CharFilter、TokenFilter、Tokenizer。关于这三个的区别可参考下节:索引分析过程。

这里主要参考ElasticSearch启动过程中相关源代码。在创建PluginService过程中初始化各种Analyzer,

加载 module/plugin jar文件:

当PluginService载入了所有的plugin后,过滤出与Analysis相关的Plugin,创建AnalysisModule

注册各种分词器、filters、analyzer的名称:(这样在创建索引的时候,为某个索引字段指定分词器,就是用的这里的注册了的名称)

引用一段《An Introduction to Information Retrieval》中关于 token、type、term、dictionary概念的解释:(这里的type和ElasticSearch索引中的type是不一样的,ElasticSearch索引中的type以后版本将不支持了)

A token is an instance of a sequence of characters in some particular document that are grouped together as a useful semantic unit for processing. A type is the class of all tokens containing the same character sequence. A term is a (perhaps normalized) type that is included in the IR system's dictionary.

For example, if the document to be indexed is to , then there are 5 tokens, but only 4 types (since there are 2 instances of to). However, if to is omitted from the index (as a stop word) then there will be only 3 terms: sleep, perchance, and dream.

个人觉得Tokenization和Analysis过程有交叉的地方。Lucene中定义的Analysis是指:将字符串转化成Tokens的过程,Analysis主要有四个方面:

The analysis package provides the mechanism to convert Strings and Readers into tokens that can be indexed by Lucene. There are four main classes in the package from which all analysis processes are derived. These are:

  1. Analyzer
  2. CharFilter
  3. Tokenizer
  4. TokenFilter

这四个的区别如下:(以中文处理举例)

比如一句中文:“这是一篇关于ElasticSearch Analyzer的文章”,CharFilter过滤其中的某个字。Tokenizer是将这句话进行中文分词:这是、一篇、关于、ElasticSearch、Analyzer、的、文章;分词得到的结果就是一个个的Token。TokenFilter则是过滤某些Token。

The Analyzer is a factory for analysis chains. Analyzers don't process text, Analyzers construct CharFilters, Tokenizers, and/or TokenFilters that process text. An Analyzer has two tasks: to produce TokenStreams that accept a reader and produces tokens, and to wrap or otherwise pre-process Reader objects.

具体可参考:Lucene7.6.0。在Lucene中,Analyzer不处理文本,它只是构建CharFilters、Tokenizer、TokenFilters, 然后让它们来处理文本。

lucene7.6.0 Analysis官方文档

ElasticSearch6.3.2源码

    以上就是本篇文章【ElasticSearch 启动时加载 Analyzer 源码分析】的全部内容了,欢迎阅览 ! 文章地址:http://xiaoguoguo.dbeile.cn/news/302.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 多贝乐移动站 http://xiaoguoguo.dbeile.cn/mobile/ , 查看更多   
最新新闻
原创浪姐全员机场走秀,61岁叶童白发飒爽,老钱风穿搭气质压全场
凌晨五点,完成了《浪姐6》的首次公演录制,姐姐们全员现身机场,一个个都自带明星气场,让整个机场都星光璀璨。其中,最亮眼的
金饰品价飙到941元,中信证券:行情可能仍未结束
现货黄金周一高开5美元,将历史新高刷新至3090美元/盎司。国内金饰价格也随之上扬,黄金品牌周生生足金饰品报价941元/克,相比28
不管谁打来电话,这5种电话不要随意接听,立马挂断
以下是文章的改写版本:这些以数字开头的陌生来电往往是推销或诈骗电话。骗子通过国外的虚拟号码平台伪造来电,骗取国内用户回拨
疯狂追星:村民开拖拉机要赵薇签名 郭德纲遭强吻
  中新网11月4日电(罗攀) 3日凌晨,韩国男团EXO成员灿烈在微博透露,自己抵达上海后,遭到约20辆粉丝车尾随,险些造成交通事故
数字赋能“渝货出海” 重庆四部门保驾护航
近日,重庆市政府口岸物流办联合重庆海关、经济信息委、重庆市农业农村委共同签署《数字陆海新通道联合预警处置闭环管理机制》,
李佳琦真实建议:普通女生不做医美,没钱没闲别跟风
近日,知名网红主播李佳琦在直播中发表了一番引发热议的言论,称他不建议普通女生去做医美,并将其称为一个需要谨慎的消费选择。
京东“以攻为守”杀入外卖市场
2月11日,京东正式推出京东外卖,在本地生活赛道投下一颗深水炸弹。当日,京东外卖正式启动“品质堂食餐饮商家”招募,2025年5月
三态股份单日成交9.16亿 换手率超46%引关注
截至2025年4月15日收盘,报10.04元,较前一交易日上涨19.95%。当日为8.39元,盘中最高触及10.04元,最低下探至7.85元,振幅达26.
“只抽5%佣金”强势入局 京东外卖悄然上线
  近日,关于“京东外卖以‘只抽5%佣金’的旗号突然冲进外卖市场”的消息在多个社交平台上迅速传播,引发了广大网友和业内人士
匠心铸就大阪世博会中国馆——建设全过程关键节点回顾(下)
4月13日,2025年日本大阪世博会中国馆即将隆重开馆,这是中国建研院历时两年,采用全过程工程咨询服务模式,在海外落地完成的重