在Elasticsearch中,分词器是用于将文本数据划分为一系列的单词(或称之为词项、tokens)的组件。这个过程是全文搜索中的关键步骤。
一个分词器通常包含以下三个部分:
Elasticsearch提供了许多内置的分词器,如标准分词器(Standard Tokenizer)、简单分词器(Simple Tokenizer)、空白分词器(Whitespace Tokenizer)、关键字分词器(Keyword Tokenizer)等。每种分词器都有其特定的应用场景,并且用户也可以自定义分词器以满足特殊需求。
在Elasticsearch中,"normalization" 是指将文本数据转化为一种标准形式的步骤。这种处理主要发生在索引时,包括以下操作:
这些转换有助于提高搜索的准确性,因为用户可能以各种不同的方式输入同一个词语。通过将索引和搜索查询都转换为相同的形式,可以更好地匹配相关结果。
说白了normalization就是将不通用的词汇变成通用的词汇。文档规范化,提高召回率。
举个例子:
假设我们希望在 Elasticsearch 中创建一个新的索引,该索引包含一个自定义分析器,该分析器将文本字段转换为小写并移除变音符号。可以使用以下请求:
在这个例子中,我们首先使用 请求创建了一个名为 "my_index" 的新索引。然后,在 对象中定义了一个名为 "my_custom_analyzer" 分析器。
这个分析器包括三部分:
最后,在 对象中,我们指定 "my_field" 字段要使用这个自定义分析器。
现在,当我们索引包含像 "Résumé" 这样的文本时,它会被标准化为"resume",这样无论用户输入 "resume" 还是 "résumé" 或者 "RESUME", 都能匹配到正确的结果。
Elasticsearch 在索引这个文档时会将 "Méditerranéen RÉSUMÉ" 转换成 "mediterraneen resume"。这样,无论搜索查询是 "Méditerranéen", "méditerranéen", "MEDITERRANÉEN", "Resume", "résumé" 或 "RESUME",都能找到这个文档。
Character filters就是在分词之前过滤掉一些无用的字符, 是 Elasticsearch 中的一种文本处理组件,它可以在分词前先对原始文本进行处理。这包括删除HTML标签、转换符号等。
下面是一些常用的 character filter:
HTML Strip Character Filter
HTML Strip Character Filter 是 Elasticsearch 中的一个 character filter,其功能是从输入的文本中去除 HTML 元素。这对于处理包含 HTML 标签的文本十分有用。
下面的例子展示了如何创建一个使用 HTML Strip Character Filter 的索引:
在这个例子中,我们首先创建了一个新的索引 "my_index"。然后,在分析器配置中,我们创建了一个名为 "my_html_analyzer" 的分析器,并在此分析器中使用了名为 "html_strip" 的内置 character filter。这将会移除 "my_field" 字段中任何的 HTML 标记,只保留纯文本内容。
如果你现在往该索引插入一个包含HTML标签的文档,例如:
Elasticsearch 将会把 "
Hello World
" 看作是 "Hello World" 进行索引。这样无论搜索者输入 "Hello World" 还是 "
Hello World
",都可以找到这个文档。
Mapping Character Filter
在Elasticsearch中,Mapping Character Filter允许通过创建自定义字符映射来预处理文本。这意味着在进行索引或搜索时,可以将特定的字符或字符序列替换为其他字符。
例如,如果你正在处理法语文本并希望统一所有形式的“è”,你可能会创建一个映射,将“è”映射为“e”。或者,如果你正在处理包含特定公司名称的文本,并希望将所有变体都映射到一个常见形式,可以使用此过滤器。
具体的配置如下:
在这个例子中,我们创建了一个新的char_filter,命名为my_char_filter。然后在分析器my_analyzer中引用了这个字符过滤器。最后,我们定义了两个映射:“&”映射为“and ”,以及“è”映射为“e”。
总的来说,Mapping Character Filter提供了一种灵活的方式,让你能够根据需求修改和控制如何处理文本数据。
当你配置了索引并创建了特定的字符映射规则后,你可以往该索引中插入文档。以下是一个例子:
在这个例子中,我们向 索引中的 字段添加了一条记录:"M&M's are delicious!"。因为我们之前在 中定义了一个映射规则,它会自动把 "&" 替换成 "and"。
所以,在Elasticsearch中,无论用户搜索 "M and M's are delicious!" 还是原始的 "M&M's are delicious!",都能找到这条记录。同时,如果你检索这个文档,例如 ,返回的结果中 字段仍为原始输入: "M&M's are delicious!",因为 character filter 只对搜索和索引过程生效,不会改变实际存储的文档内容。
Mapping Character Filter还有一个使用场景,比如平时我们网上发送弹幕或者游戏中公屏聊天的时候,要是说脏话,脏话内容会被替代为:*。
Pattern Replace Character Filter
Pattern Replace Character Filter 是 Elasticsearch 中一个强大的工具,它允许使用正则表达式来匹配文本,并将匹配的内容替换为指定的字符串。这对于处理有复杂需求的文本非常有用。
例如,假设你需要在索引或搜索时删除所有的数字,可以使用 Pattern Replace Character Filter,并设置一个匹配所有数字的正则表达式 ,然后将其替换为空字符串或其他所需的字符。
示例如下:
在这个例子中,我们定义了一个名为 的字符过滤器,该过滤器将所有数字(匹配正则表达式 )替换为一个空字符串("")。然后,在我们的分析器 中使用了这个字符过滤器。最后,在映射中我们指定了字段 "text" 使用这个分析器。因此,当你向 "text" 字段存储含有数字的文本时,所有的数字会被移除。
当你配置好索引并设定了特定的字符过滤规则后,你可以向这个索引插入文档。例如:
在这个例子中,我们向索引的字段添加了一条记录:"I have 10 apples."。因为我们之前在 中定义了一个正则表达式替换规则,它会自动把数字("[0-9]")替换为空字符串。
所以,在Elasticsearch中,无论用户搜索 "I have apples." 还是原始的 "I have 10 apples.",都能找到这条记录。同时,如果你检索这个文档,例如 ,返回的结果中 字段仍为原始输入: "I have 10 apples.",因为 character filter 只对搜索和索引过程生效,不会改变实际存储的文档内容。
Pattern Replace Character Filter有一个常用的场景就是手机号脱敏,比如:假设我们希望将电话号码中的某几位数字替换为星号 "*" 来进行脱敏处理。可以使用 Pattern Replace Character Filter 进行配置,如下:
在这个示例中,我们创建的 将匹配任意连续10位数字的电话号码,并将其中的第 4 至第 7 位替换为四个星号 "*"。
然后插入一条包含手机号的文档:
Elasticsearch 在索引这个文档时,会按照我们设置的规则将手机号码脱敏为 "",所以无论用户搜索 "My phone number is ." 还是 "My phone number is ." 都能找到这条记录。
在 Elasticsearch 中,Token Filter 负责处理 Analyzer 的 Tokenizer 输出的单词或者 tokens。这些处理操作包括:转换为小写、删除停用词、添加同义词等。
大小写和停用词
以下是一个例子,我们创建一个自定义分析器来演示如何使用 和 :
在这个例子中,我们创建了一个名为 的自定义分析器,它首先使用 分词器将文本分割成 tokens,然后使用 将所有 tokens 转换为小写形式,并使用 过滤器移除英文停用词。
现在插入一条记录来测试:
上述例子中的文本 "The Quick BROWN Fox Jumps Over THE Lazy Dog",运用我们自定义的 my_analyzer 分析器后,停用词(如 "The", "Over")将被剔除,并且所有的单词都会被转化为小写。所以这句话在进行索引和搜索时,实际上会被处理成:["quick", "brown", "fox", "jumps", "lazy", "dog"]。
同义词
可以帮助我们处理同义词。它可以将某个词或短语映射到其它的同义词。
例如,假设你有一个电子商务网站,并且你想让搜索 "cellphone" 的用户也能看到所有包含 "mobile", "smartphone" 的商品。你可以使用 来实现这一目标。
以下是一个使用 的例子:
在这个设置中,我们创建了一个名为 的同义词过滤器,并定义了 "cellphone", "mobile", "smartphone" 是互为同义词。然后我们在 分析器中使用了该过滤器。
所以现在,无论你是输入 "cellphone", "mobile", 还是 "smartphone" 搜索,Elasticsearch 都会将其视为相同的查询。
我们可以使用 指定同义词规则路径,这个文件中列出了所有你定义的同义词,每行都是一组同义词,各词之间用逗号分隔。
使用 参数的主要优点是,你可以在不重启 Elasticsearch 或重新索引数据的情况下,通过更新这个文件来动态地改变同义词规则。
假设你有一个名为 的文件,内容如下:
然后你可以这样配置你的 index:
在这个设置中,我们创建了一个自定义分析器 ,并使用了一个自定义的同义词过滤器 。过滤器中的 参数指向了存放同义词的 文件。
注意: 是相对于 目录的路径。例如,如果你的 目录在 ,那么 文件应该放在 。
在 Elasticsearch 中,分词器是用于将文本字段分解成独立的关键词(或称为 token)的组件。这是全文搜索中的一个重要过程。Elasticsearch 提供了多种内建的 tokenizer。
以下是一些常用的 tokenizer:
你可以根据不同的数据和查询需求,选择适当的 tokenizer。另外,也可以通过定义 custom analyzer 来混合使用 tokenizer 和 filter(比如 lowercase filter,stop words filter 等)以达到更复杂的分词需求。
自定义分词器:custom analyzer
在 Elasticsearch 中,你可以创建自定义分词器(Custom Analyzer)。一个自定义分词器由一个 tokenizer 和零个或多个 token filters 组成。tokenizer 负责将输入文本划分为一系列 token,然后 token filters 对这些 token 进行处理,比如转换成小写、删除停用词等。
以下是一个自定义分析器的例子:
在这个配置中,我们首先定义了一个名为 的停用词过滤器,包含两个停用词 "the" 和 "and"。然后我们创建了一个名为 的自定义分析器,其中使用了 以及 和 。
因此,在为字段 索引文本时,Elasticsearch 会首先使用 将文本切分为 tokens,然后将这些 tokens 转换为小写,并移除其中的 "the" 和 "and"。对于搜索查询也同样适用此规则。
elasticsearch 默认的内置分词器对中文的分词效果可能并不理想,因为它们主要是针对英文等拉丁语系的文本设计的。如果要在中文文本上获得更好的分词效果,我们可以考虑使用中文专用的分词器。
IK 分词器是一个开源的中文分词器插件,特别为 Elasticsearch 设计和优化。它在中文文本的分词处理上表现出色,能够根据中文语言习惯进行精细的分词。
安装和部署
ik文件描述
ik提供的两种analyzer
ik自定义词库
要使用 IK 分词器的自定义词库,需要对 IK 插件的配置文件进行修改。步骤如下:
上述配置告诉 IK 分词器使用 作为扩展字典,但没有设置扩展的停用词字典。
注意这种方式只支持静态词库,一旦词库文件更改,则需要重启 Elasticsearch 才能加载新的词条。
热更新
要修改词库,必须重启ES才能生效,有时我们会频繁更新词库,比较麻烦,更致命的是,es肯定是分布式的,可
能有数百个节点,我们不能每次都一个一个节点上面去修改。基于这种场景,我们可以使用热更新功能。
实现热更新有2种办法:基于远程词库和基于数据库。
基于远程词库
IK 分词器支持从远程 URL 下载扩展字典,这就可以用来实现词库的热更新。
在 配置文件中,你可以设置 和 属性为一个指向你的在线词库文件的 URL:
此设置告诉 IK 分词器从指定的 URL 下载词库。它会周期性地(默认每 60 秒)检查这些 URL,如果发现有更新,就重新下载并加载新的词库。
根据官方文档,该请求需要满足下列2点:
满足上面两点要求就可以实现热更新分词了,不需要重启 ES 实例。
可以将需要自动更新的热词放在一个 UTF-8 编码的 .txt 文件里,放在 nginx 或其他简易 http server 下,当 .txt 文件修改时,http server 会在客户端请求该文件时自动返回相应的 Last-Modified 和 ETag。可以另外做一个工具来从业务系统提取相关词汇,并更新这个 .txt 文件。
基于远程词库这种方式比较简单上手,但是也存在一些缺点:
缺点:
基于数据库
另外一种方式是基于数据库,这种方式使用比较多,但需要修改ik插件源码,有一定复杂度。
基本思路是将词库维护在数据库(MySQL,Oracle等),修改ik源码去数据库加载词库,然后将源码重新打包引入到我们的elasticsearch中。
大概操作步骤如下:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/9302.html