皮皮网

【智慧物业app源码】【mytoken源码】【miner 源码】es分词源码_es分词器

2024-12-23 02:08:35 来源:usb对拷源码

1.Es搜索优化(一)-基于分词模块
2.ES中文分词-IK分词
3.ES中的分词器
4.ElasticSearch源码:数据类型
5.es 分词问题
6.ElasticSearch 分词器,了解一下

es分词源码_es分词器

Es搜索优化(一)-基于分词模块

       本文为五篇系列文章之一,分词分词旨在探讨 Elasticsearch 搜索优化中的源码分词模块。掌握分词模块是分词分词提升搜索体验的关键步骤。

       首先,源码分词是分词分词将文本拆分成多个词或短语的过程。在 Elasticsearch 中,源码智慧物业app源码分词模块是分词分词实现这一功能的核心。

       分词模块由三个主要部分构成:CharacterFilters、源码Tokenizer 和 TokenFilters。分词分词CharacterFilters 对输入文本进行预处理,源码Tokenizer 将文本拆分成词,分词分词TokenFilters 则对拆分后的源码词进行进一步的清洗和标准化。

       在分词过程中,分词分词CharacterFilters 的源码作用是过滤或修改文本中的字符,例如去除标点符号或特殊字符。分词分词Tokenizer 则负责将文本分割成词,这是搜索的基础。TokenFilters 则用于处理生成的词,如去除停止词、转换词干或进行词形还原。

       针对业务需求,优化搜索体验尤为重要。搜索粒度最小化为词而非字,有助于提高搜索的精确度和速度。具体策略如下:

       一种解决方法是通过 Token Length Filter,该过滤器允许开发者设置最小词长度,从而避免短词对搜索结果的干扰。

       另一种策略是使用 Mapping Character Filter 对常见的单个词进行过滤,减少无关搜索结果的产生。

       此外,展示同义词和同音词可以提升搜索体验。开发者可以自定义分词规则,mytoken源码甚至实现热更新,以适应不断变化的业务需求。

       对于想要深入了解的读者,推荐参考 Elasticsearch 官方文档。官方指南提供了详细的分词模块使用方法和最佳实践。

       希望本文能帮助你解决在 Elasticsearch 搜索优化中遇到的问题。如果你觉得内容有帮助,不妨点赞支持。如有疑问或发现错误,欢迎随时留言交流。

ES中文分词-IK分词

       在ES中,IK分词器是常用的中文分词器,支持自定义词库,词库热更新,无需重启集群。其Analyzer: ik_smart和Tokenizer: ik_max_word是两种常用的分词方式。ik_max_word进行最细粒度的拆分,会尽可能将文本拆分为各个可能的组合,例如"中华人民共和国国歌"会被拆分为"中华人民共和国"、"中华人民"、"中华"、"华人"、"人民共和国"、"人民"、"人"、"民"、"共和国"、"共和"、"和"、"国国"、"国歌"。miner 源码而ik_smart则进行最粗粒度的拆分,将"中华人民共和国国歌"拆分为"中华人民共和国"和"国歌"。

       IK分词器拥有自己的词库,包括关键词词库和停用词词库,支持扩展自定义词库。关键词词库会将搜索语句按照关键词进行切割,停用词词库则会直接去掉不参与分词的词汇。例如"中华人民共和国国歌"会被拆分成"中华人民共和国"和"国歌",并进行下一步的处理。

       在实际使用中,IK分词器可以结合同义词功能,以达到更好的分词效果。同义词功能能够将指定的词汇转换为另一种形式,例如将"苹果"转换为"apple",这样在搜索时,系统会同时考虑"苹果"和"apple"。使用同义词功能时,需要设置type字段表示当前词是分词类型。此外,还可以使用动态同义词分词插件,根据自己的需求适配ES版本。

       对于音译词的处理,可以使用pingyin分词插件。该插件能够将音译词转换为文字搜索,例如将"Apple"转换为"苹果"。可以通过访问其github地址进行了解和使用。

       结合IK分词器、同义词功能和pingyin分词插件,可以实现更全面和准确的中文分词,提高搜索效率和准确性。在具体应用中,cyberplayer 源码应根据实际需求选择合适的分词方式,并结合其他功能进行优化。

ES中的分词器

        全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这些处理算法被称为Token Filter(词元处理器),被处理后的结果被称为Term(词), 文档中包含了几个这样的Term被称为Frequency(词频)。 引擎会建立Term和原文档的Inverted Index(倒排索引), 这样就能根据Term很快到找到源文档了。 文本被Tokenizer处理前可能要做一些预处理, 比如去掉里面的HTML标记, 这些处理的算法被称为Character Filter(字符过滤器), 这整个的分析算法被称为Analyzer(分析器)。

        整个分析过程,如下图所示:

        从第一部分内容可以看出:Analyzer(分析器)由Tokenizer(分词器)和Filter(过滤器)组成。

        ES允许用户通过配置文件elasticsearch.yml自定义分析器Analyzer,如下:

        上面配置信息注册了一个分析器myAnalyzer,在次注册了之后可以在索引或者查询的时候直接使用。该分析器的功能和标准分析器差不多,tokenizer: standard,使用了标准分词器 ;filter: [standard, lowercase, stop],使用了标准过滤器、转小写过滤器和停用词过滤器。

        ElasticSearch默认使用的标准分词器在处理中文的时候会把中文单词切分成一个一个的汉字,所以在很多时候我们会发现效果并不符合我们预期,尤其在我们使用中文文本切分之后本该为一个词语却成了单个的汉字,因此这里我们使用效果更佳的中文分词器es-ik。

        ik 带有两个分词器:

        区别:

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

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

        查询 “希拉里和韩国”

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

ElasticSearch源码:数据类型

       ElasticSearch源码版本 7.5.2,其底层基于Lucene,Lucene好比汽车的发动机,提供了基础的存储和查询功能,而ES则在此基础上增加了分布式特性。本文将简要探讨ES中的数据类型。

       Lucene的FieldType是描述字段属性的核心,包含个属性,如倒排索引和DocValuesType,后者支持聚合排序。官方定义的类型如TextField,仅索引、分词但不存储,而用户可以根据需求自定义数据类型,尽管在ES中,所有数据类型都是自定义的。

       Lucene文件格式类型各异,如Norms和Pre-Document Values,根据FieldType设置的不同属性,文件类型和存储结构会相应变化。Lucene通过不同的压缩类型和数据结构存储数据,但详细实现较为复杂。

       在ES中,数据类型分为Meta-fields和Fields or properties。Meta-fields包括元数据字段如_index、_type和_id,它们存储在特定位置,但处理方式各异。Fields或properties则是wetest源码开发的核心,包括String(text和keyword)、数字类型、Range类型、时间类型、Boolean和Binary等。

       复杂数据类型如Object和Nested用于处理嵌套结构,而Geo-point和Geo-shape用于地理信息。特殊数据类型如IP、completion和Join则在特定场景下使用。Array要求数组内字段类型一致,Multi-fields则支持多种处理方式的字符串字段。

       总体来说,ES的字段类型丰富且友好,但并非所有场景都适用。开发者在实际应用中应参考官方文档和代码来选择和使用。

       参考资源:org.apache.lucene.codecs.lucene (Lucene 9.0.0核心API)、Elasticsearch Guide [7.5]、elastic.co/guide/en/ela...

es 分词问题

       探讨 Elasticsearch 的分词问题,我们以一个舆情搜索项目为例。该项目中,我们遇到了一个令人困惑的问题:使用关键词查询后,返回的文本内容中并未包含这个关键词。在查询结果中,关键词 "unita" 被高亮显示,但实际文本中仅有 "unit"。这引起了我们的注意。

       倒排索引是 Elasticsearch 的底层原理,由 Lucene 实现。倒排索引通过构建一系列倒排链,使得通过词条查询具体的文档成为可能。在 Elasticsearch 字段类型中,分为可以分析字段(如 text)和不可分析字段(如 keyword)。不可分析字段在索引存储中是以最小单元 term 形式存在,而分析字段在索引创建过程中通过特定分析器进行分析,生成一系列的 term。通过这些 term 构建倒排索引,实现基于词条的文档查询。

       以倒排索引为基础,我们深入探讨了 Elasticsearch 的倒排链概念。假设存在三篇文档,其 name 和 age 字段分别具有两条倒排链,而 describe 字段设置为 text 类型,经过标准分析器处理后,生成倒排链。各种查询,尤其是 match 查询,首先对传入文本进行切词,然后在相应字段的倒排索引链中进行查找。

       Elasticsearch 的分析器是构成查询功能的关键组件,包括语言分析器、指纹分析器、标准分析器、简单分析器和自定义分析器等多种类型。分词器是分析器的一部分,负责对文本进行分词。对于英语,通常使用 standard tokenizer 进行处理。此外,分析器还包括过滤器和词干抽取器,过滤器用于去除无用文本,词干抽取器则用于提取词根,减少索引表中的词条数量,提升索引的创建、存储和查询性能。

       重新审视最初的问题,使用 "unita" 进行查询却得到 "unit" 的结果,原因是分析器在处理文本时将其分解为 "unit" 和 "a"。在西班牙语分析器下,"unita" 被正确地解析为 "unit"。这一现象揭示了 Elasticsearch 在处理多语言文本时的复杂性。为了深入理解这一问题,我们可以使用分析器对 "unita" 进行单独分析,从而获得其被分解的词素。

       通过分析发现,当使用 standard tokenizer 对 "unita" 进行分词时,其结果为 "unita"。然而,实际查询结果显示为 "unit",这可能是由于词干抽取器的作用,将 "unita" 转换为了 "unit"。在处理多语言文本时,分析器、分词器和词干抽取器的协同作用可能导致某些文本的解析结果与预期不符。对于这个问题,关键在于正确识别和理解 Elasticsearch 在处理不同语言文本时所采用的分析策略。

ElasticSearch 分词器,了解一下

        这篇文章主要来介绍下什么是 Analysis ,什么是分词器,以及 ElasticSearch 自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。

        首先来说下什么是 Analysis:

        顾名思义,文本分析就是把全文本转换成一系列单词(term/token)的过程,也叫分词。在 ES 中,Analysis 是通过分词器(Analyzer)来实现的,可使用 ES 内置的分析器或者按需定制化分析器。

        举一个分词简单的例子:比如你输入 Mastering Elasticsearch ,会自动帮你分成两个单词,一个是 mastering ,另一个是 elasticsearch ,可以看出单词也被转化成了小写的。

        再简单了解了 Analysis 与 Analyzer 之后,让我们来看下分词器的组成:

        分词器是专门处理分词的组件,分词器由以下三部分组成:

        同时 Analyzer 三个部分也是有顺序的,从图中可以看出,从上到下依次经过 Character Filters , Tokenizer 以及 Token Filters ,这个顺序比较好理解,一个文本进来肯定要先对文本数据进行处理,再去分词,最后对分词的结果进行过滤。

        其中,ES 内置了许多分词器:

        接下来会对以上分词器进行讲解,在讲解之前先来看下很有用的 API: _analyzer API :

        它可以通过以下三种方式来查看分词器是怎么样工作的:

        再了解了 Analyzer API 后,让我们一起看下 ES 内置的分词器:

        首先来介绍下 Stamdard Analyzer 分词器:

        它是 ES 默认的分词器,它会对输入的文本按词的方式进行切分,切分好以后会进行转小写处理,默认的 stopwords 是关闭的。

        下面使用 Kibana 看一下它是怎么样进行工作的,在 Kibana 的开发工具(Dev Tools)中指定 Analyzer 为 standard ,并输入文本 In , Java is the best language in the world. ,然后我们运行一下:

        运行结果如下:

        可以看出是按照空格、非字母的方式对输入的文本进行了转换,比如对 Java 做了转小写,对一些停用词也没有去掉,比如 in 。

        其中 token 为分词结果; start_offset 为起始偏移; end_offset 为结束偏移; position 为分词位置。

        下面来看下 Simple Analyzer 分词器:

        它只包括了 Lower Case 的 Tokenizer ,它会按照非字母切分,非字母的会被去除,最后对切分好的做转小写处理,然后接着用刚才的输入文本,分词器换成 simple 来进行分词,运行结果如下:

        从结果中可以看出,数字 被去除掉了,说明非字母的的确会被去除,所有的词也都做了小写转换。

        现在,我们来看下 Whitespace Analyzer 分词器:

        它非常简单,根据名称也可以看出是按照空格进行切分的,下面我们来看下它是怎么样工作的:

        可以看出,只是按照空格进行切分, 数字还是在的, Java 的首字母还是大写的, , 还是保留的。

        接下来看 Stop Analyzer 分词器:

        它由 Lowe Case 的 Tokenizer 和 Stop 的 Token Filters 组成的,相较于刚才提到的 Simple Analyzer ,多了 stop 过滤,stop 就是会把 the , a , is 等修饰词去除,同样让我们看下运行结果:

        可以看到 in is the 等词都被 stop filter 过滤掉了。

        接下来看下 Keyword Analyzer :

        它其实不做分词处理,只是将输入作为 Term 输出,我们来看下运行结果:

        我们可以看到,没有对输入文本进行分词,而是直接作为 Term 输出了。

        接下来看下 Pattern Analyzer :

        它可以通过正则表达式的方式进行分词,默认是用 \W+ 进行分割的,也就是非字母的符合进行切分的,由于运行结果和 Stamdard Analyzer 一样,就不展示了。

        ES 为不同国家语言的输入提供了 Language Analyzer 分词器,在里面可以指定不同的语言,我们用 english 进行分词看下:

        可以看出 language 被改成了 languag ,同时它也是有 stop 过滤器的,比如 in , is 等词也被去除了。

        最后,让我们看下中文分词:

        中文分词有特定的难点,不像英文,单词有自然的空格作为分隔,在中文句子中,不能简单地切分成一个个的字,而是需要分成有含义的词,但是在不同的上下文,是有不同的理解的。

        比如以下例子:

        那么,让我们来看下 ICU Analyzer 分词器,它提供了 Unicode 的支持,更好的支持亚洲语言!

        我们先用 standard 来分词,以便于和 ICU 进行对比。

        运行结果就不展示了,分词是一个字一个字切分的,明显效果不是很好,接下来用 ICU 进行分词,分词结果如下:

        可以看到分成了 各国 , 有 , 企业 , 相继 , 倒闭 ,显然比刚才的效果好了很多。

        还有许多中文分词器,在这里列举几个:

        IK:

        jieba:

        THULAC:

        大家可以自己安装下,看下它中文分词效果。

        本文主要介绍了 ElasticSearch 自带的分词器,学习了使用 _analyzer API 去查看它的分词情况,最后还介绍下中文分词是怎么做的。

Elasticsearch7.8.0集成IK分词器改源码实现MySql5.7.2实现动态词库实时更新

       本文旨在探讨 Elasticsearch 7.8.0 集成 IK 分词器的改源码实现,配合 MySQl 5.7.2 实现动态词库实时更新的方法。

       IK 分词器源码通过 URL 请求文件或接口实现热更新,无需重启 ES 实例。然而,这种方式并不稳定,因此,采用更为推荐的方案,即修改源码实现轮询查询数据库,以实现实时更新。

       在进行配置时,需下载 IK 分词器源码,并确保 maven 依赖与 ES 版本号相匹配。引入 MySQl 驱动后,开始对源码进行修改。

       首先,创建一个名为 HotDictReloadThread 的新类,用于执行远程词库热更新。接着,修改 Dictionary 类的 initial 方法,以创建并启动 HotDictReloadThread 实例,执行字典热更新操作。

       在 Dictionary 类中,找到 reLoadMainDict 方法,针对扩展词库维护的逻辑,新增代码加载 MySQl 词库。为此,需预先在数据库中创建一张表,用于维护扩展词和停用词。同时,在项目根路径的 config 目录下创建 jdbc-reload.properties 配置文件,用于数据库连接配置。

       通过 jdbc-reload.properties 文件加载数据库连接,执行扩展词 SQL,将结果集添加到扩展词库中。类似地,实现同步 MySQl 停用词的逻辑,确保代码的清晰性和可维护性。

       完成基础配置后,打包插件并将 MySQl 驱动 mysql-connector-java.jar 与插件一同发布。将插件置于 ES 的 plugins 目录下,并确保有相应的目录结构。启动 ES,查看日志输出,以验证词库更新功能的运行状态。

       在此过程中,可能遇到如 Column 'word' not found、Could not create connection to database server、no suitable driver found for jdbc:mysql://...、AccessControlException: access denied 等异常。通过调整 SQL 字段别名、确认驱动版本匹配、确保正确配置环境以及修改 Java 政策文件,这些问题均可得到解决。

       本文通过具体步骤和代码示例,详细介绍了 Elasticsearch 7.8.0 集成 IK 分词器,配合 MySQl 5.7.2 实现动态词库实时更新的完整流程。读者可根据本文指南,完成相关配置和代码修改,以实现高效且稳定的词库管理。

ES自定义分词器

       es的分词器往往包括3个低级构建块包:

        Standard Analyzer

        标准分析仪按照Unicode文本分段算法的定义,将文本分割成单词边界的分词。它删除了大多数标点符号,小写显示分词,并支持删除stop words。

        Simple Analyzer

        当遇到不是字母的字符时,简单的分析器会将文本分成条目。小写显示分词。

        Whitespace Analyzer

        空格分析器遇到任何空格字符时都会将文本分为多个项目。不会把分词转换为小写字母。

        Stop Analyzer

        停止分析仪和Simple Analyzer类似,但也支持stop words的删除。

        Keyword Analyzer

        一个“noop”分析器,它可以接受任何给定的文本,并输出完全相同的文本作为一个单词。

        Pattern Analyzer

        使用正则表达式拆分分词,支持lower-casing和stop words。

        Language Analyzers

        Elasticsearch提供许多语言特定的分析器,如英语或法语。

        Fingerprint Analyzer

        一个专门的分析仪,它可以创建一个可用于重复检测的指纹。

       /p/fe5eaad

        对中文文本以英文逗号作为分隔符分词:

        将分析器设置到索引上

        获取分词结果

       /yu/article/details/

Elasticsearch(ES)分词器的那些事儿

       在Elasticsearch中,分词器扮演着关键角色,它将文本拆分成可搜索的词,利于倒排索引的构建。本文将深入探讨内置分词器和IK分词器,以及自定义词库的相关内容。

       2. 内置分词器包括standard,简单按照字母处理,如大写转小写;simple,分隔非字母字符;whitespace,按空格分词;stop,去除无意义词;keyword,不分词。查看分词效果可以通过通用接口进行。

       对于中文分词,Elasticsearch的内置分词器不适用,这时就需要引入IK分词器。首先,从GitHub下载并安装,如cd到相应目录并执行解压和重启Elasticsearch。IK分词器提供ik_max_word和ik_smart两种模式,分别适用于Term Query和Phrase查询。要调整分词效果,可以自定义词库,通过编辑IKAnalyzer.cfg.xml和my.dic文件实现。

       在实际应用中,自定义词库能确保查询的准确性,例如"追风人"在分词后保持原词,避免查询时的困扰。

       总结,掌握Elasticsearch的分词器策略和自定义词库的设置,能有效提升搜索的效率和准确性。尽管本文未涉及点赞、评论和关注,但希望这些知识对您的工作有所帮助。