Elasticsearch文本分析与分词器

背景:公司最近采用Elasticsearch搜索,以前一直没有深入的了解过,今天看了一下Elasticsearch文本分析这一块,记录自己的理解,也为大家分享自己的见解,如有错误欢迎指正。
    分词是针对于文字内容的,所以这里只说文本类型,说起分词,首先来说一下es中的类型,es以前的文本类型是String类型,后来将String类型一分为二,改为keyword与text类型,既然String一分为二,那么肯定这两个类型是有区别的。它们的区别如下。
均摘自于官网描述

**keyword**
关键字数据类型
一个字段,用于索引结构化内容,如电子邮件地址、主机名、状态码、邮政编码或标签。
它们通常用于过滤(查找发布状态的所有博客文章)、排序和聚合。关键字字段只能通过它们的确切值进行搜索。
如果您需要索引全文内容,如电子邮件正文或产品描述,您可能应该使用文本字段。
**text**
这些字段将被分析,也就是说,它们将通过分析器在索引之前将字符串转换为单个术语的列表。分析过程允许Elasticsearch在每个全文字段中搜索单个单词。文本字段不用于排序,也很少用于聚合(尽管重要文本聚合是一个明显的例外)。

    这里有一个需要说明的地方,在text类型的简介中,我们可以看括号中的内容,这句话说明text类型是可以聚合的,但并不建议聚合。因为text类型没有聚合的必要,如果非要聚合,建议使用字段多类型进行聚合(设置多类型不在此处提及)。

    我们先进行一个测试,不用管这个请求中这个参数是什么,我们只需要直到里面有个text字段,它是一段文本,然后我们请求看一下结果

POST _analyze
{
  "tokenizer": "standard",
  "filter":  [ "lowercase" ],
  "text":      "这是一个测试"
}
返回结果: 
{
  "tokens" : [
    {
      "token" : "这",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "是",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "一",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "个",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    },
    {
      "token" : "测",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "<IDEOGRAPHIC>",
      "position" : 4
    },
    {
      "token" : "试",
      "start_offset" : 5,
      "end_offset" : 6,
      "type" : "<IDEOGRAPHIC>",
      "position" : 5
    }
  ]
}

    根据上面来看,es帮我们把这段文本给我们拆开了,拆成一个字一个字的,这是es默认的分词器。

    接下来我们说,es是怎么进行文本分析的,先摆上结论,es是根据我们使用的字符过滤器,分词器以及词项过滤器来对我们的文本进行分析。
es对我们保存的文本分析,会经过以下几步
1.内容会经过字符串过滤器
2.分词器
3.词项过滤器
4.落地es倒排索引
第一步主要是将我们输入的字符串进行修改,例如我们输入AAAAA,如果我们有需求可配置让其转成aaaaa
第二步主要是将我们的文本进行分词,例如说上面那个”这是一个测试“,这段文本,es默认的分词器会帮我们进行分词,上面的结果大家也看到了,会帮我们分词成一个字一个字的。
第三步 在第二步中,分词的结果会汇聚成类似于一条河流,源源不断的给词项过滤器,过滤器可以将添加,删除,修改词项
第四步 生成倒排索引文件进行存储

文本分析会发生两次
索引时间
    索引文档后,text将分析所有字段值。
搜索时间
    在字段上进行全文搜索时text,将分析查询字符串(用户正在搜索的文本)

    有一个点我们需要知道,对文字字段进行搜索,其实是对分词之后的内容进行搜索,这也告诉我们一个事实,我们查询时输入的文本要跟存入数据时的配置要一样。否则的话可能会造成匹配不到。

    有同学可能想到一个问题,这个分词之后的内容不怎么是我想要的啊,因为es默认的分词器帮我们分词成一个字一个字的,我们进行搜索的时候输入的文本也会被分词成一个一个的,这样实际上它们匹配的结果并不准确。
实际上,es为我们提供了8种分词器,我们可以进行选择。选择满足我们业务的一种,也可以为每个字段设置它的专属分词器。

    如有错误,欢迎指正,共同进步

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值