前言
通过上篇文章的介绍后,已经了解elasticSearch可以作为搜索引擎, 提供快速的搜索能力。为什么elasticSearch具有这种能力呢?
因为内部使用了索引。接下来,这篇文章将对索引进行介绍。
索引分析模块首先要介绍的是index analysis module,索引分析模块,它用于注册分析器。
分析器将String field转化为多个分词,然后添加到反向索引中,以便进行文档搜索。
分析器是如何构成的?
| 字符过滤器 | 接收原始文本并视为字符流,通过添加、删除、改变字符的方式对字符流进行转换。 | 一个分析器可以有多个字符过滤器。 |
| 分词器 | 接收字符流,进行分词,输出分词流。例如空格分词器,利用空格对文本进行分词。 记录每个分词的顺序、位置,原始词的首尾偏移量。 | 一个分析器只有一个分词器。 |
| 分词过滤器 | 接收分词流,对分词进行添加、删除、修改。例如小写分词过滤器、连接词分词过滤器。 | 一个分析器可有多个分词过滤器 |
如何支持文本field进行全文搜索呢?
这就需要text analysis了。文本分析作用在于对非结构化的文本进行结构化转换,以便es进行全文
搜索,返回相关性结果,而不是绝对匹配的结果。
何时需要进行text analysis?
索引内有text field且需要进行文本搜索。
文本分析发生在什么情况呢?
文本分析发生在两个地方:
- 对文档进行索引时,text field value会被分析。此时称为索引分析器。
- 对text field进行全文搜索时,用户提供的搜索文本会被分析。此时称为搜索分析器。
这两种情况称为index and search analysis。
一般情况下,创建索引时和全文搜索时使用同一个分析器,确保进行分词匹配前使用同一套分析规则。
可以自定义分析器吗?
es提供了内置的分析器、字符过滤器、分词器、分词过滤器,同时支持自定义这些组件。
自定义分析器涉及的配置项:
| type | 内置的分析器类型或自定义custom | Built-in analyzer reference | Elasticsearch Guide [7.15] | Elastic |
| tokenizer | 内置或自定义的分词器 | Tokenizer reference | Elasticsearch Guide [7.15] | Elastic |
| char_filter | 内置或自定义字符过滤器组成的数组 | Character filters reference | Elasticsearch Guide [7.15] | Elastic |
| filter | 内置或自定义分词过滤器组成的数组 |
举例说明
// 使用内置组件
{
"settings": {
"analysis": {
"analyzer": {
// 自定义分析器名字
"my_custom_analyzer": {
// 自定义分析器的组件配置
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
// 自定义组件
{
"settings": {
"analysis": {
"analyzer": {
// 自定义分析器名字
"my_custom_analyzer": {
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
// 自定义分词器名称
"punctuation": {
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
// 自定义字符过滤器名称
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
// 自定义分词过滤器名称
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
}
}
如何更好的支持中文场景呢?
有一个问题,需要搜索的文本时中文时,内置分析器的表现不符合预期,分词效果不好。需要引入支持中文的分析器elasticsearch-analysis-ik。



