前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >21.Elasticsearch分析与分析器

21.Elasticsearch分析与分析器

作者头像
IT云清
发布2019-01-22 11:21:36
5760
发布2019-01-22 11:21:36
举报
文章被收录于专栏:IT云清IT云清

本文讲解Elasticsearch对文本的分析及内置的分析器。

1.分析

分析 包含下面的过程:

首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。

2.分析器

分析器 实际上是将三个功能封装到了一个包里:

2.1字符过滤器

首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and

2.2分词器

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

2.3Token 过滤器

最后,词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如,小写化 Quick ),删除词条(例如, 像 aandthe 等无用词),或者增加词条(例如,像 jump 和 leap 这种同义词)。 Elasticsearch提供了开箱即用的字符过滤器、分词器和token 过滤器。 这些可以组合起来形成自定义的分析器以用于不同的目的。我们会在 自定义分析器 章节详细讨论。

3.内置分析器

但是, Elasticsearch还附带了可以直接使用的预包装的分析器。 接下来我们会列出最重要的分析器。为了证明它们的差异,我们看看每个分析器会从下面的字符串得到哪些词条:

代码语言:javascript
复制
"Set the shape to semi-transparent by calling set_trans(5)"
3.1标准分析器

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

代码语言:javascript
复制
set, the, shape, to, semi, transparent, by, calling, set_trans, 5
3.2简单分析器

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

代码语言:javascript
复制
set, the, shape, to, semi, transparent, by, calling, set, trans
3.3空格分析器

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

代码语言:javascript
复制
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
3.4语言分析器

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

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

代码语言:javascript
复制
set, shape, semi, transpar, call, set_tran, 5

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

4.什么时候使用分析器

当我们 索引 一个文档,它的全文域被分析成词条以用来创建倒排索引。 但是,当我们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索的词条格式与索引中的词条格式一致。

全文查询,理解每个域是如何定义的,因此它们可以做 正确的事:

  • 当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。
  • 当你查询一个 精确值 域时,不会分析查询字符串, 而是搜索你指定的精确值。 现在你可以理解在 开始章节 的查询为什么返回那样的结果:

date 域包含一个精确值:单独的词条 2014-09-15。 _all 域是一个全文域,所以分词进程将日期转化为三个词条: 201409, 和 15。 当我们在 _all 域查询 2014,它匹配所有的12条推文,因为它们都含有 2014 :

代码语言:javascript
复制
GET /_search?q=2014              # 12 results

当我们在 _all 域查询 2014-09-15,它首先分析查询字符串,产生匹配 201409, 或 `15 中 任意 词条的查询。这也会匹配所有12条推文,因为它们都含有 2014 :

代码语言:javascript
复制
GET /_search?q=2014-09-15        # 12 results !

当我们在 date 域查询 2014-09-15,它寻找 精确 日期,只找到一个推文:

代码语言:javascript
复制
GET /_search?q=date:2014-09-15   # 1  result

当我们在 date 域查询 2014,它找不到任何文档,因为没有文档含有这个精确日志:

代码语言:javascript
复制
GET /_search?q=date:2014         # 0  results !

5.测试分析器

有些时候很难理解分词的过程和实际被存储到索引中的词条,特别是你刚接触 Elasticsearch。为了理解发生了什么,你可以使用 analyze API 来看文本是如何被分析的。在消息体里,指定分析器和要分析的文本:

5.1使用标准分词器
代码语言:javascript
复制
GET /_analyze 
{
  "analyzer": "standard",
  "text": "i love you 丽水市人名政府"
}

分词结果:

代码语言:javascript
复制
{
  "tokens": [
    {
      "token": "i",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "love",
      "start_offset": 2,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "you",
      "start_offset": 7,
      "end_offset": 10,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "丽",
      "start_offset": 11,
      "end_offset": 12,
      "type": "<IDEOGRAPHIC>",
      "position": 3
    },
    {
      "token": "水",
      "start_offset": 12,
      "end_offset": 13,
      "type": "<IDEOGRAPHIC>",
      "position": 4
    },
    {
      "token": "市",
      "start_offset": 13,
      "end_offset": 14,
      "type": "<IDEOGRAPHIC>",
      "position": 5
    },
    {
      "token": "人",
      "start_offset": 14,
      "end_offset": 15,
      "type": "<IDEOGRAPHIC>",
      "position": 6
    },
    {
      "token": "名",
      "start_offset": 15,
      "end_offset": 16,
      "type": "<IDEOGRAPHIC>",
      "position": 7
    },
    {
      "token": "政",
      "start_offset": 16,
      "end_offset": 17,
      "type": "<IDEOGRAPHIC>",
      "position": 8
    },
    {
      "token": "府",
      "start_offset": 17,
      "end_offset": 18,
      "type": "<IDEOGRAPHIC>",
      "position": 9
    }
  ]
}
5.2使用ik分词器
代码语言:javascript
复制
GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "i love you 丽水市人名政府"
}

分词结果

代码语言:javascript
复制
{
  "tokens": [
    {
      "token": "i",
      "start_offset": 0,
      "end_offset": 1,
      "type": "ENGLISH",
      "position": 0
    },
    {
      "token": "love",
      "start_offset": 2,
      "end_offset": 6,
      "type": "ENGLISH",
      "position": 1
    },
    {
      "token": "you",
      "start_offset": 7,
      "end_offset": 10,
      "type": "ENGLISH",
      "position": 2
    },
    {
      "token": "丽水市",
      "start_offset": 11,
      "end_offset": 14,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "丽水",
      "start_offset": 11,
      "end_offset": 13,
      "type": "CN_WORD",
      "position": 4
    },
    {
      "token": "市",
      "start_offset": 13,
      "end_offset": 14,
      "type": "CN_CHAR",
      "position": 5
    },
    {
      "token": "人名",
      "start_offset": 14,
      "end_offset": 16,
      "type": "CN_WORD",
      "position": 6
    },
    {
      "token": "政府",
      "start_offset": 16,
      "end_offset": 18,
      "type": "CN_WORD",
      "position": 7
    }
  ]
}

token 是实际存储到索引中的词条。 position 指明词条在原始文本中出现的位置。 start_offset 和 end_offset 指明字符在原始字符串中的位置。(每个分析器的 type 值都不一样,可以忽略它们)

analyze API 是一个有用的工具,它有助于我们理解Elasticsearch索引内部发生了什么,随着深入,我们会进一步讨论它。

指定分析器编辑

当Elasticsearch在你的文档中检测到一个新的字符串域 ,它会自动设置其为一个全文 字符串 域,使用 标准 分析器对它进行分析。

你不希望总是这样。可能你想使用一个不同的分析器,适用于你的数据使用的语言。有时候你想要一个字符串域就是一个字符串域–不使用分析,直接索引你传入的精确值,例如用户ID或者一个内部的状态域或标签。

要做到这一点,我们必须手动指定这些域的映射。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年05月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文讲解Elasticsearch对文本的分析及内置的分析器。
  • 1.分析
  • 2.分析器
    • 2.1字符过滤器
      • 2.2分词器
        • 2.3Token 过滤器
        • 3.内置分析器
          • 3.1标准分析器
            • 3.2简单分析器
              • 3.3空格分析器
                • 3.4语言分析器
                • 4.什么时候使用分析器
                • 5.测试分析器
                  • 5.1使用标准分词器
                    • 5.2使用ik分词器
                    • 指定分析器编辑
                    相关产品与服务
                    Elasticsearch Service
                    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档