ELK STACK之elasticsearch(三)分析和映射

ELK STACK ginotang 791℃ 0评论

分析器

分析器对elasticsearch中的数据搜索起着决定性的作用。当我们把数据保存到ES的时候,必须先经过分析器分析,拆分,最后才把这些处理后的数据保存。

  • 首先, 分析器将输入的文本分成适合于倒排索引的独立的词条
  • 其次,将这些词条统一化为标准格式以提高它们的可搜索性

在上面两个过程,分析器执行了三个功能

  1. 字符过滤

    例如把html字符过滤掉,或者把&转化为and

  2. 分词

    字符串被分词器分割为单个的词条。简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条

  3. token过滤

    词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。

内置分析器

ES内置了几个开箱即用的分析器,下面简单介绍它们之间的差异。

以下面的字符串为例子:

  • 标准分析器

    标准分析器是Elasticsearch默认使用的分析器。它是分析各种语言文本最常用的选择。它根据 Unicode 联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。它会产生 如下结果

  • 简单分析器

    简单分析器在任何不是字母的地方分隔文本,将词条小写。它会产生

  • 空格分析器

    空格分析器在空格的地方划分文本。它会产生

  • 语言分析器

    特定语言分析器可用于 很多语言。它们可以考虑指定语言的特点。例如, 英语 分析器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响),它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干

    英语 分词器会产生下面的词条:

    注意看 transparentcalling 和 set_trans 已经变为词根格式。

analyze API

通过analyze API,我们可以清晰看到每一个文本是如何被拆分的,例如:

返回的数据是:

文本会被拆分成3个词条。如果使用whitespace(空格)分析器,结果就完全不一样

得到的结果是:

这次这个文本会被认为是一个完整的词条,不会被拆分。

什么时候会对数据进行分析

当我们提交数据以进行搜索的时候,ES会根据提交的数据是全文域还是精确值来确定是否执行分析过程。

  • 当你查询一个 全文域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。
  • 当你查询一个 精确值 域时,不会分析查询字符串, 而是搜索你指定的精确值。

一般精确值的数据类型为:数字、时间、布尔值或者手动标记为not_analyzed的文本域。这些数据类型通常会被term使用。除了这些数据类型外,其他基本上都是全文域。

倒排索引

倒排索引类似于表结构,它用于保存分析器拆分后的单独的词条,这些词条不具有重复性,它们都是唯一的,倒排索引会记录这些词条出现在哪个文档中。

例如,假设我们有两个文档,每个文档的 content 域包含如下内容:

  1. The quick brown fox jumped over the lazy dog
  2. Quick brown foxes leap over lazy dogs in summer

储存入倒排索引后:

分词小写和词干提取

当文档被索引(保存进ES)的时候,分词可能会被小写化或者进行词干提取,这些行为由分析器决定。最后上面的倒排索引很可能会简化成:

用户的搜索过程和文档的索引过程一致:都会被分析和转化,这样ES中的数据才能最终被用户搜索到。

类型和映射

要知道是否对数据进行分析,ES就必须知道数据的类型,ES支持如下简单的数据类型

  • 字符串: string(新版本中已经移除,使用text代替)
  • 整数 : byte, short, integer, long
  • 浮点数: float, double
  • 布尔型: boolean
  • 日期: date

ES默认使用动态映射:通过JSON中基本数据类型,尝试猜测域类型 。

如果数字使用双引号("")括起来,ES会认为它是一个字符串,但是如果该字段被手动映射为数字,ES会尝试把该字符串转换为数字,如果转换失败会抛出异常。

查看映射

ES提供了mapping API来查看数据的类型映射。

准备测试数据

然后使用mapping API查看

配置映射

由于我们不能修改已有数据的映射,如果要更新映射,则需要删除原来的索引重新建立。

查看新的映射

映射中的多字段

出于某种目的,我们可能会对同一字段以不同的方式索引,例如,使一个字段既可用于全文搜索,也可用于精确查找。这个时候就需要使用多字段(Multi-fields)。多字段实际上是在mapping的时候给一个字段起一个子名称,然后指定不同的索引方式。

上面的设置方式只能在新版本中起作用,因为旧版中并没有keyword数据类型,因此旧版本中设置方式为:

准备测试数据

现在尝试一下是否可以使用精确匹配raw字段

测试结果:

注意: 我们进行精确匹配的时候,必须使用它的子名称,而不是使用原字段

转载请注明:Pure nonsense » ELK STACK之elasticsearch(三)分析和映射

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x