草庐IT

Elasticsearch:文本分析器剖析

Elastic 中国社区官方博客 2023-04-10 原文

Elasticsearch 中的分析器是一个软件模块,主要负责两个功能:tokenization (分词化) 和 normalization(规范化)。 Elasticsearch 采用分词化和规范化过程,因此文本字段被彻底分析并存储在倒排索引中以进行高级查询匹配。 在深入剖析分析器之前,让我们从较高的层次看一下这些概念。

Tokenization

Tokenization,也即分词化是将句子拆分成单个单词的过程,它遵循一定的规则。 例如,我们可以指示进程按分隔符(例如空格、字母、模式或其他标准)来打断句子。 这个过程由一个称为分词器(tokenizer)的组件执行,它的唯一工作是在将句子分解为单词时遵循一定的规则将句子分解为称为分词(token)的单个单词。 在分词化过程中通常使用空格分词器(whitespace tokenizer),句子中的每个单词都由空格分隔,删除任何标点符号和其他非字符。

POST _analyze
{
  "text": "I like Beijing, China",
  "analyzer": "whitespace"
}

结果:[I, like, Beijing, China]

单词也可以根据非字母、冒号或其他一些自定义分隔符进行拆分。 例如,一位影评人的评价是,“The movie was sick!!! Hilarious :) :)” 可以拆分成单独的词:“The”、“movie”、“was”、“sick”、“Hilarious” 等(注意这些词尚未小写)。 或者 “picked-peppers” 可以分词为 “picked” 和“peppers”,“K8s” 可以分词为 “K” 和“s”,等等。 虽然这有助于搜索单词(单个或组合),但它只能回答所有查询,例如具有同义词、复数和我们前面提到的其他搜索的查询。 规范化(normalization)过程将从这里进行分析到下一阶段。

Normalization

规范化是以词干提取、同义词、停用词和其他特征的形式对分词(词)进行处理、转换、修改和丰富的地方。 这里是将附加功能添加到分析过程的地方,以确保数据被适当地存储以用于搜索目的。 一个这样的特征是词干提取:词干提取是一种将单词缩减(词干化)为其根词的操作。 例如,“author” 是 “authors”、“authoring” 和 “authored” 的词根。

除了词干提取之外,规范化还涉及在将它们添加到倒排索引之前找到合适的同义词。 例如,“author” 可能有其他同义词,如 “wordsmith”、“novelist”、“writer”等。 最后,每个文档都会有一些词,例如 “a”、“an”、“and”、“is”、“but”、“the” 等等,这些词被称为停用词(stop words),因为它们确实没有一个地方可以找到相关文件,因为这些词太普遍了。

这两个功能 —— 分词化和规范化 —— 都是由分析器模块执行的。 分析器通过使用过滤器和分词器来做到这一点。 让我们剖析分析器模块,看看它是由什么构成的。

分析器的剖析

分词化和规范化基本上由三个软件组件执行:字符过滤器分词器分词过滤器 —— 它们基本上被粘合为一个分析器模块。 如下图所示,分析器模块由一组过滤器和一个分词器组成。 过滤器既可以在原始文本上作为字符过滤器使用,也可以在标记化文本上作为分词过滤器使用。 分词器(tokenizer)的工作是将句子拆分成单独的词(分词)。

 

所有文本字段都通过此管道:原始文本由字符过滤器清理,并将生成的文本传递给分词器。 然后分词器将文本拆分为分词(也称作单个单词)。 然后,分词通过分词过滤器进行修改、丰富和增强。 最后,最终确定的分词将存储在适当的倒排索引中。 搜索查询也以与文本索引相同的方式进行分析。

下图显示了一个解释分析过程的示例。

分析器由三个底层构建块组成。 这些都是:

  • 字符过滤器(Character filters)—— 应用于字符级别,文本的每个字符都通过这些过滤器。
  • 过滤器的工作是从文本字符串中删除不需要的字符。 例如,此过程可以从输入文本中清除 <h1>、<href>、<src> 等 HTML 标记。 它还有助于用其他文本替换某些文本(例如,希腊字母与等效的英语单词)或匹配正则表达式 (regex) 中的某些文本并将其替换为等效文本(例如,基于正则表达式匹配电子邮件并提取组织域)。 这些字符过滤器是可选的; 分析器可以在没有字符过滤器的情况下存在。 Elasticsearch 提供了三种开箱即用的字符过滤器:html_stripma​​ppingpattern_replace
  • 分词器(tokenizer)—— 使用分隔符(例如空格、标点符号或某种形式的单词边界)将句子拆分为单词。更多分词器的描述,请参阅文章 “Elasticsearch: analyzer
  • 每个分析器(analyer)必须有一个且只有一个分词器。 Elasticsearch 提供了一些这样的分词器来帮助将传入的文本拆分成单独的分词。 然后可以将这些词输入分词过滤器以进一步规范化。 Elasticsearch 默认使用标准分析器(stanard analyzer),它根据语法和标点符号来分解单词。
  • 分词过滤器(token filter) —— 处理由分词器生成的分词以进行进一步处理。 例如,分词可以更改大小写、创建同义词、提供词根(词干提取)或生成 n-gram 和 shingles 等。
  • 分词过滤器是可选的。 它们可以是零个或多个,与分析器模块相关联。 Elasticsearch 开箱即用地提供了一长串分词过滤器。

请注意,字符和标记过滤器都是可选的,但我们必须有一个分词器。

更多阅读:

有关Elasticsearch:文本分析器剖析的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

  3. ruby - 如何为 pbcopy 生成富文本链接 - 2

    我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te

  4. ruby-on-rails - 尝试打开 .gitignore 以在文本编辑器中对其进行编辑,但在 OS X Mountain Lion 上找不到文件位置 - 2

    我使用“newapp_name”创建了一个新的Rails应用程序,我正在尝试编辑.gitignore文件,但在我的应用程序文件夹中找不到它。我在哪里可以找到它?我安装了Git。 最佳答案 .gitignore位于项目的root中,而不是app子目录中。首先打开终端并进入您的目录。您需要使用ls-a来显示stash文件。然后使用打开.gitignore 关于ruby-on-rails-尝试打开.gitignore以在文本编辑器中对其进行编辑,但在OSXMountainLion上找不到文件位

  5. ruby - 如何将一段文本可逆地压缩成更少的 ASCII 字符? - 2

    我想获取任意的ASCII文本字符串,例如“Helloworld”,并将其压缩为字符数较少(尽可能少)的版本,但要采用可以解压缩的方式。压缩版本应仅由ascii字符组成。有没有一种方法可以做到这一点,尤其是在Ruby中? 最佳答案 如果知道只会使用ASCII字符,那就是每个字节的低7位。通过位操作,您可以将每8个字节混合成7个字节(节省12.5%)。如果您可以将其放入更小的范围(仅限64个有效字符),则可以删除另一个字节。但是,因为您希望压缩形式也只包含ASCII字符,所以会丢失一个字节-除非您的输入可以限制为64个字符(例如,有损压

  6. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

  7. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  8. ruby - 使用 Nokogiri 和 Ruby 从 html 文档获取链接和 href 文本? - 2

    我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t

  9. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  10. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

随机推荐