elaseticsearch 配置ik分词器的热更新_Elasticsearch从入门到放弃:分词器初印象

0af51f28d33fe8e39d6828a5b93f5420.png

Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来继续更新。

之前我们聊过了 Elasticsearch 的索引和文档,不太熟悉的话可以先翻阅一下前文。今天再一起聊一下 Elasticsearch 的分词器。

关于分词

如果你是讲 Elasticsearch 作为搜索引擎,那么你应该需要对分词进行了解,Elasticsearch 的分词是将全文本转换为一系列单词,这样有助于在搜索时得到相关的结果以及相关性分析。例如我们有一个文本为“I love Elasticsearch”,然后 Elasticsearch 可以将其分解为三个单词,这时我们无论搜索哪个单词,都能搜到这个文本。

Elasticsearch 通过分词器对文本进行分词处理,Elasticsearch 的分词器是由 Character Filters、Tokenizer 和Token Filter 三部分组成。在介绍它们之前,我们先来简单了解一下 Analyze API,它可以帮助我们快速测试一个 Analyzer 的作用,它的用法也非常简单:

GET /_analyze
{"analyzer" : "standard","text" : "Quick Brown Foxes!"
}

其中,analyzer 是指定的分词器,text 是被测试的文本,这样就能得到这个文本分词后的效果。

这是最简单的一种用法,此外,我们还可以在 path 中指定 index,用于测试指定索引中 mapping 设置的 analyzer 或者索引默认的 analyzer。当然,你也可以测试一下自定义的 analyzer,只需要在参数中设置好 Character Filters、Tokenizer 和Token Filter 即可。关于 Analyze API 更多的使用方法可以自行查阅官方文档 Analyze API

内置 Analyzer

为了方便使用,Elasticsearch 为我们提供了几种内置 Analyzer:

  • Fingerprint:它可以将文本处理为小写的、去除扩展的、有序的、唯一的单词
  • Keyword:不分词
  • Language:提供了30多种常见语言的分词器
  • Pattern:使用正则表达式分词,默认W+(非字符分隔)
  • Simple:按照非字母切分,小写处理
  • Standard:默认分词器,会基于 Unicode 文本语法,按照单词划分,并进行小写处理
  • Stop:小写处理,过滤停用词(the, a, is)
  • Whitespace:按照空格切分,不转小写

现在我们来测试一下 Whitespace Analyzer

GET _analyze
{"analyzer": "whitespace","text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

它的执行结果是

{"tokens" : [{"token" : "The","start_offset" : 0,"end_offset" : 3,"type" : "word","position" : 0},{"token" : "2","start_offset" : 4,"end_offset" : 5,"type" : "word","position" : 1},{"token" : "QUICK","start_offset" : 6,"end_offset" : 11,"type" : "word","position" : 2},{"token" : "Brown-Foxes","start_offset" : 12,"end_offset" : 23,"type" : "word","position" : 3},{"token" : "jumped","start_offset" : 24,"end_offset" : 30,"type" : "word","position" : 4},{"token" : "over","start_offset" : 31,"end_offset" : 35,"type" : "word","position" : 5},{"token" : "the","start_offset" : 36,"end_offset" : 39,"type" : "word","position" : 6},{"token" : "lazy","start_offset" : 40,"end_offset" : 44,"type" : "word","position" : 7},{"token" : "dog's","start_offset" : 45,"end_offset" : 50,"type" : "word","position" : 8},{"token" : "bone.","start_offset" : 51,"end_offset" : 56,"type" : "word","position" : 9}]
}

如果有兴趣,可以自行测试一下其他的内置 Analyzer。除了内置的 Analyzer 之外,你也可以根据需要自定义分词器。

下面我们来看怎么定义我们需要的 Analyzer。

前面提到 Analyzer 由三部分组成,其中 Character Filters 用于对原始文本进行处理(例如去掉html标签),Tokenizer 是按照指定规则进行切分,Token Filter 负责将切分的单词进行加工(例如转小写)。

Character Filters

Character Filters 是分词的第一步,Elasticsearch 用它来对原始文本进行一些处理。内置的 Character Filters 有三个,分别是:

  • HTML strip:使用解码值替换HTML标签
  • Mapping:使用指定的替换项替换指定的字符串
  • Pattern replace:使用指定的替换项替换正则匹配的字符串

HTML strip 默认会替换文本中所有的 HTML 标签,你也可以通过设置escaped_tags,将一些特定的标签排除

PUT my_index
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "keyword","char_filter": ["my_custom_html_strip_char_filter"]}},"char_filter": {"my_custom_html_strip_char_filter": {"type": "html_strip","escaped_tags": ["b"]}}}}
}

这个自定义 Analyzer 就不会替换标签 b。

0dedc31abdd4937e6daa2a750935cdb8.png

Tokenizer

在对原始文本进行初步的处理之后,Tokenizer 就要上场了,它帮助我们根据指定的规则进行分词,Elasticsearch 同样提供了一些内置的 Tokenizer。

  • Character group:按照配置的字符组进行切分
  • Classic:针对英语语法进行分词
  • Edge n-gram:从单词的起始字符开始按长度依次切分quick 会被分为[q, qu, qui, quic, quick]
  • Keyword:不切分
  • Letter:遇到非字母的字符进行切分
  • Lowercase:与类似 Letter 类似,不过它会把切分后的单词转为小写
  • N-gram:把单词切分为指定长度的字符串集合,quick 会被分为[qu, ui, ic, ck]
  • Path hierarchy:对路径进行切分,/foo/bar/baz 会分为[/foo, /foo/bar, /foo/bar/baz]
  • Pattern:根据正则匹配进行切分
  • Simple pattern:正则会受到一些限制,但不支持按照匹配到的分割符切分
  • Simple pattern split:是支持按照匹配到的分割符切分的Simple pattern
  • Standard:按照单词进行切分
  • Thai:针对泰语进行切分
  • UAX URL email:与 Standard 相似,但它会把 url 或邮箱当作一个整体
  • Whitespace:按照空格进行切分

在这里你可以先对这些内置的 Tokenizer 有个初步的了解,知道它们能干什么,在具体使用的时候可以查阅官方文档进行更详细的了解,很多 Tokenizer 还支持一些参数配置,这些到实际场景中灵活使用就好。

Token Filter

Elasticsearch 内置的 Token Filter 非常多,这里列几个常用的吧:

  • Trim:删除前后空格
  • Uppercase:转大写
  • Lowercase:转小写
  • Stop:停用词过滤
  • ……

Elasticsearch 中内置的这些分词器及组件可以满足我们日常的大部分需求了,能够做到灵活应用就很厉害了。如果真的遇到解决不了的问题,你也可以尝试自定义分词器,例如对我们的中文进行分词。

中文分词

中文分词的难点在于,它不像英文那样有天然的空格可以进行切分,我们也不能简单的把它分成一个个的字,而是要分成有意义的词。

比较不错的中文分词器有 ICU Analyzer、IK 和 THULAC

ICU Analyzer

ICU Analyzer 并不是 Elasticsearch 内置的分词器,所以我们需要预先安装插件才能使用

执行命令

elasticsearch-plugin install analysis-icu

进行安装,安装好以后可以使用命令elasticsearch-plugin list进行查看。

安装好之后就可以运行下面这个例子

GET _analyze
{"analyzer": "standard", "text": "觉得好看就点赞"
}GET _analyze
{"analyzer": "icu_analyzer", "text": "觉得好看就点赞"
}

你会发现 standard analyzer 就是把这句话拆成一个个字,而 icu analyzer 基本会根据语义进行拆分。

总结

经过本文的介绍,相信你对 Elasticsearch 的分词器也有了一个初步的认识,知道它由什么组成,能够使用 Analyze API 对一个分词器进行简单的测试,也基本能够自定义一些分词器了。

我对内置的 Token Filter 介绍的比较少,你可以结合官方文档,对你感兴趣的 Token Filter 进行更深入的研究,如果有什么问题也欢迎和我讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器windows模拟linux环境,科学网—Windows不用虚拟机或双系统,轻松实现shell环境:gitforwindows - 刘永鑫的博文...

windows缺少shell命令支持用过Linux服务器分析数据的小伙伴,一定对Linux强大Shell命令所折服,经常会感觉windows缺少这些命令而感觉不方便。还有想学习Linux Shell命令的小伙伴,一直没有一个很好的学习环境。双系统安装涉及分区改变对硬盘数据…

Mac OS 系统的发展历史

文章目录System 1.0(1984)System 2.0(1985)System 3.0(1986)System 4.0(1987)System 5.0(1987)System 6.0 (1988)System 7 (1991 )Sys…

苹果公司的电脑发展史——硬件篇

文章目录一、Apple I(1976)二、Apple II(1977)三、Lisa(1983)四、Macintosh(1984)五、PowerBook(1991)六、iMac(1998)七、iBook&#…

my.ini修改后服务无法启动_Spring Cloud Eureka 服务实现不停机(Zero-downtime)部署

问题互联网产品高速迭代,通常伴随着高频次的版本发布。部署新版上线需要重启服务,直接 kill 服务进程可能会造成服务短暂不可用,从而影响到正在使用的用户。Spring Cloud 项目中一般会用到 Ribbon 作为负载均衡,那么是不是只要保证…

苹果电脑 Mac OS X 系统诞生的故事和发展历史

文章目录CoplandNeXTRhapsodyOS XPublic Beta (Kodiak)Mac OS X v10.0 (Cheetah)Mac OS X v10.1 (Puma)Mac OS X v10.2 (Jaguar)Mac OS X v10.3 (Panther)Mac OS X v10.4 (Tiger)Mac OS X v10.5 (Leopard)Mac OS X v10.6 (Snow Leopard)Mac OS X Lion2001 年 3 月 24 日&#x…

Mac OS 的历史

文章目录概述1980年代前20世纪80年代20世纪90年代2000年以后概述 纵观电脑之历史,操作系统与计算机硬件的发展息息相关。 操作系统之本意原为提供简单的工作排序能力,后为辅助更新更复杂的硬件设施而渐渐演化。 从最早的批处理模式开始,分…

java 反射 速度_Java反射,但速度更快

java 反射 速度在编译时不知道Java类的最快方法是什么? Java框架通常会这样做。 很多。 它可以直接影响其性能。 因此,让我们对不同的方法进行基准测试,例如反射,方法句柄和代码生成。 用例 假设我们有一个简单的Person类&#x…

macOS 内核之 OS X 系统的起源

文章目录一、苹果公司早期(1972-1991)二、苹果在操作系统上的尝试(1991-1997)2.1 Star Trek 项目 (1992-1993)2.2 Copland-Mac OS 8 (1994-1996)三、收购与转折(1996-1997)四、NeXT 篇章4.1 NEXTSTEP(1985-1997)4.2 OpenStep(1993-1997)五、Mach 的历史5.1 Rochester’s Intell…

docker create_Docker动手教程2.2:容器基本操作2

内容摘要暂停/取消暂停容器删除容器进入容器创建容器暂停/取消暂停容器暂停容器命令:docker pause 容器ID/容器名注意STATUS列,被暂停的容器的状态依旧是“Up”,但是后面括号显示为“Paused”。取消暂停命令:docker unpause 容器I…

关于 Mac OS X 内核技术来源

Mach(Multiple Asynchronously Communication Hosts) 是一个由卡内基梅隆大学开发的操作系统内核,Mach的开发是为了取代BSD的UNIX核心。 Mach 内核的设计目标之一是要兼容 Unix 系统。 当初他们的设想是,真正的操作系统可以作为一…

用C语言编程画出图形,C语言图形编程(六) -图形程序设计实例:零件图形的绘制...

实例:一个零件图形的绘制有一个零件图,如下:对图3-1中的零件图形,如何根据它所标注的尺寸,按照适当的顺序有步聚地画出该图形,这首先要分析此零件图形的几何关系,了解构成这个图形各线段的性质&…

mfc怎么获取进程的线程数_Python多线程获取小米应用商店App,看看我是怎么做到的

一、【项目背景】小米应用商店给用户发现最好的安卓应用和游戏,安全可靠,可是要下载东西要一个一个的搜索太麻烦了。而且速度并不是很快。今天小编就教大家利用多线程爬取小米应用商店的游戏模块,快速获取我们想要的软件安装包。二、【项目目标】目标 &a…

Linux Distribution Timeline for 2010(Linux 2010 年发行版时间线/族谱/发展图)

此图来自维基百科(wikimedia),具体地址为:https://commons.wikimedia.org/wiki/File:Linux_Distribution_Timeline.svg?uselangzh-hans#filehistory

git强制推送_Git 常用命令

Git 常用命令总结1. GIT 工作区add commitworking directory ------- index(stage) ---------- HEAD | | | | | | 工作目录 暂存区 …

golang 泛型_Golang 1.x版本泛型编程

本文介绍了Golang 1.x版本的泛型编程。往期回顾:浅谈动态追踪技术Go是一门天生为服务器程序设计的简洁的语言,因此Go的设计原则聚焦在可扩展性、可读性和并发性,而多态性并不是这门语言的设计初衷,因此就被放在了一边。虽然在2.0版…

jwt令牌_JWT令牌的秘密轮换

jwt令牌当您使用JSON Web令牌 ( JWT )或需要对有效载荷信息进行签名或加密的任何其他令牌技术时,设置令牌的到期日期很重要,因此,如果令牌到期,则可以假定这可能被视为安全漏洞,您拒绝使用此令牌…

jasperreports_JasperReports:棘手的部分

jasperreports如果您使用Java进行编程的时间足够长,则有可能需要为业务用户生成报告。 就我而言,我已经看到几个项目使用JasperReportsLibrary来生成PDF和其他文件格式的报告。 最近,我荣幸地观察了Mike和他的团队使用上述报告库以及他们所面…

电脑运行adb闪退_adb+python进阶使用

之前文章有提到过使用python加adb刷视频,今天带来进阶版——无线多台手机。首先要使用adb连接多台手机,手机和电脑肯定要在统一局域网内。1.打开手机开发者模式,并通过USB接口链接电脑。2.打开cmd:输入adb tcpip 5555, 会得到相关…

java office在线编辑_国外10个最受欢迎的 Java 开发的 CMS 系统

CMS是Content Management System的缩写,意为"内容管理系统",它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本。CMS的功能并不只限于文本处理,它也可以处理图片、Flash动画、声像流、图像甚至电子…