1. Text Analysis
1.1 概述
(1)文本分析[Text Analysis]:是将非结构化文本转化为对搜索进行优化的结构化格式的过程; (2)文本分析让es执行全文搜索,搜索返回全部的相关文档,不仅仅是精确匹配文档; (3)通过分词使全文搜索成为可能。将文本分解成更小的块,称作分词,多大数情况下,这些分词是独立的词。
1.2 发生两次文本分析
(1)建立索引时:当文档被索引时,任何text字段的值都将被分析 (2)查询时:当在一个text字段上运行全文搜索(full-text search)时,用户正在搜索的文本会被分析
1.3 为文本建立全文索引的步骤
- tokenization
该过程将文本拆分成一小块一小块,这一小块内容称之为token,大多数情况下一个token代表着一个词语 - normalization
tokenization能够解决单个关键字的查询,但是关键字与token的匹配仍然是字符串的精确匹配,这种程度的匹配无法解决以下情况
序号 | 存在的问题 | 实例 |
---|
1 | 英文单词大小写问题 | 'Quick’与’quick’无法匹配 | 2 | 英文单词词根问题 | 'created’与’create’无法匹配; | 3 | 英文单词同义词问题 | 'like’与’love’无法匹配 |
为了解决这个问题,文本解析当中引入nomalization处理过程,将token转化为标准格式,这也就意味着能与token匹配的关键字不要求与token完全一致,只需要概念上相关即可; 为确保搜索关键词能够按照预期与指定单词匹配,可以对查询的字符串应用tokenization规则和normalization规则
1.4 自定义analyzer
文本解析是由analyzer具体执行的,它是控制整个过程的一组规则。
ES包含的默认analyzer(standard analyzer),该analyzer在英文环境当中一般够用了,中文环境当中需要额外配置analyzer。 如果希望能够自定义搜索结果,可以指定其他的内置的analyzer甚至可以自定义analyzer。 自定义的analyzer允许使用者从三个方面来控制解析过程: (1)在进行tokenization之前更改文本; (2)执行tokenization将文本转化成token; (3)在对token建立索引或搜索之前执行normalization;
1.5 analyzer组成
不管是内置的还是自定义的analyzer都由三类低级构件打包而成,三类构件分别为:character filter、tokenizers以及token filter
序号 | 构件名称 | 构件说明 |
---|
1 | character filter | 字符过滤器接收原始文本的字符流并通过添加、移除或者更改字符达到转换流的目的;例如可以从流中将罗马数字转换成阿拉伯数字或者从流中剔除HTML文档中的<b>元素等,一个analyzer可以包含0或多个字符过滤器且过滤器按顺序生效 | 2 | tokenizer | okenizer接收字符流并将其拆分为一个个token(一般为一个个单词),最终输出token流;例如whitespace tokenizer将文本以空格为区分拆成一个个token,如’day day up’将被转换成’[day,day,up]’;tokenizer同时也会记录每个关键词的位置以及关键词在原始文本中的起止位置,一个analyzer必须有且仅有一个tokenizer | 3 | token filters | token过滤器接收token流且可能会对其进行增加、移除或改变;例如lowercase类型的token过滤器会将所有的token全部转换成小写格式,stop类型的token过滤器会移除token流所有停用词(the,is,a…),而synonym类型的token过滤器会向token流中引入同义词;token filter不允许修改token在token流中的位置以及字符的偏移量;一个analyzer可以包含0或多个token滤器且过滤器按顺序生效 |
1.6 索引和搜索的analyzer如何同时工作
- 大多数情况下,索引和搜索时应该使用相同的analyzer,这可确保字段的值和查询字符串时使用相同形式的分词。即:在搜索时将确保分词按照预期匹配。
- 在极少数情况下,索引和搜索时使用不同的analyzer才是有意义的,ES允许你指定一个单独的search analyzer。通常是对于字段的值和查询字符串使用相同的分词方式返回不期望或者不相关的匹配文档时,一个独立的search analyzer才被指定。
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.13/analysis-index-search-time.html
1.7 Stemming词干提取、Token graphs
- 一篇博客:https://blog.csdn.net/weixin_28906733/article/details/106515334
- 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.13/token-graphs.html
1.8 ES如何决定analyzer
搜索时,ES按顺序检查下列参数去选择使用哪个analyzer:
- 搜索时指定的analyzer参数
GET my-index-000001/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
- 字段mapping中的search_analyzer
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace",
"search_analyzer": "simple"
}
}
}
}
- 索引setting中的analysis.analyzer.default_search
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}
- 字段mapping中的analyzer
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
如果上述参数都没有指定,那么standard analyzer将被使用
2. 分词
ES的默认分词器: standard analyzer
|