背景:公司最近采用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种分词器,我们可以进行选择。选择满足我们业务的一种,也可以为每个字段设置它的专属分词器。
如有错误,欢迎指正,共同进步