Analyzer(分析器)是Elasticsearch中的一个核心组件,它是负责分析文本的处理流程。当一个文档(document)被索引到Elasticsearch中后,Analyzer会对文档内容进行分析,将文档中的所有文本数据转化成一系列词条(terms),然后将这些词条存储在倒排索引(inverted index)中,以便快速地检索。本文将详细介绍Analyzer的原理、使用方法和案例说明。
## 1. Analyzer的原理
Analyzer的核心就是分析(analyze)一个文本流程。这个过程包括三个步骤:字符过滤器(Char Filter) -> 词汇单元化(Tokenzier) -> 词单元过滤器(Token Filter)。
### 1.1 字符过滤器(Char Filter)
字符过滤器主要负责将原始的文本数据进行预处理。首先会将文本内容中的HTML标签、符号、注释等无用信息去掉,然后将一些特殊字符进行转换,如将 转换成空格等。
例如,当一个文本内容为 "
hello world!
" 时,字符过滤器的作用是去掉 "" 和 "
",将 "hello world!" 转换成一个纯文本,以便后续的处理流程。### 1.2 词汇单元化(Tokenizer)
词汇单元化将一个文本流转化为一系列的词汇单元(Token)。一般情况下,词汇单元化是通过将文本流进行分割,以空格、标点符号、数字等作为分割符,将文本流分割成一个一个的词汇单元。
例如,当一个文本内容为 "Hello world!" 时,经过分词器处理后,会将其转化成 ["Hello", "world"]。
### 1.3 词单元过滤器(Token Filter)
词单元过滤器会对分词器生成的词汇单元进行进一步的处理。它的主要作用是删除一些无用的词汇,将词汇进行大小写转换、同义词替换等操作。
例如,将一个文本内容中的单词都转换成小写,这样可以在搜索时忽略大小写的差异。
## 2. Analyzer的使用方法
Analyzer在Elasticsearch中是通过设置Index的mapping来指定的。每个Index都有一个mapping,这个mapping包含了Index中所有Field的定义信息。在mapping中指定Field的Analyzer,就可以控制分析器如何处理Field中的文本内容。
### 2.1 创建Index和mapping
假设我们要创建一个名为“books”的Index,它包括两个Field:“title”和“description”。
```json
PUT /books
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "standard"
},
"description": {
"type": "text",
"analyzer": "english"
}
}
}
}
```
以上代码演示了如何创建一个Index,并给其中的"title"和"description"两个Field分别指定了不同的Analyzer。这里"title"使用的是"standard"分析器,它会去掉一些常见的词汇,如"a"、"the"、"and"等。而"description"使用的是"english"分析器,它会对文本内容进行少量的停用词过滤、统一英文单复数形式等操作。
### 2.2 查询Index
当Index建立完成后,可以使用如下代码查询Index:
```json
GET /books/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
```
以上代码中,我们对title进行了搜索,搜索的关键字是"Elasticsearch"。当输入搜索关键字后,Elasticsearch会自动使用"title"这个Field对搜索关键字进行相应的分析处理,然后进行检索。
## 3. Analyzer的案例说明
### 3.1 案例1:使用nGram分析器实现部分匹配搜索
假设我们有一个包含海量用户信息的Index,其中某个Field为"username",我们需要实现一种搜索功能:输入用户名的一部分,搜索出所有与该关键字匹配的用户。
使用设计好的模式,使用如下代码创建Index:
```json
PUT /users
{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "ngram_tokenizer"
}
},
"tokenizer": {
"ngram_tokenizer": {
"type": "ngram",
"min_gram": 2,
"max_gram": 10,
"token_chars": ["letter", "digit"]
}
}
}
},
"mappings": {
"properties": {
"username": {
"type": "text",
"analyzer": "ngram_analyzer"
}
}
}
}
```
以上代码中,我们首先定义了一个ngram分析器,用来处理输入的搜索关键字。ngram分析器可以对输入的搜索关键字进行分词处理,分词的范围由参数“min_gram”和“max_gram”决定。例如,当“min_gram”为2,"max_gram"为10时,对于输入的字符串“hello”,会将其分词为“he”,“el”,“ll”,“lo”等4个词条。
然后我们将上面定义的分析器应用到“username”这个Field中,在搜索时就可以使用“username”这个Field,用部分的用户名进行搜索:
```json
GET /users/_search
{
"query": {
"match": {
"username": {
"query": "tom",
"operator": "or"
}
}
}
}
```
对于上面的搜索请求,Elasticsearch会对“tom”进行分词,然后搜索所有包含“tom”中任意一个词条的用户。
### 3.2 案例2:使用IK中文分析器处理中文内容
IK中文分析器是Elasticsearch中针对中文文本的一个分析器,它能够完成中文分词和词性标注、同义词转换、繁简体转换等处理。
使用如下代码创建Index并在"title"和"content"这两个Field中使用IK中文分析器:
```json
PUT /news
{
"settings": {
"analysis": {
"analyzer": {
"ik_smart": {
"tokenizer": "ik_smart"
},
"ik_max_word": {
"tokenizer": "ik_max_word"
}
},
"tokenizer": {
"ik_smart": {
"type": "ik_smart"
},
"ik_max_word": {
"type": "ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"content": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
```
在上述代码中,“ik_smart”分析器会尽量带有语义的分词结果;而“ik_max_word”分析器在分词过程中会充分细分出更多的词元,例如:原本只会将“中央情报局”识别为一词,而“ik_max_word”则会细分出“中央、中央情报局、情报、情报局”等多个词元。使用时,需要看具体的需求和实际需求进行选择使用。
```json
GET /news/_search
{
"query": {
"match": {
"title": "新冠疫情"
}
}
}
```
以上代码中,我们对标题进行了搜索,搜索的关键字是“新冠疫情”。当输入搜索关键字后,Elasticsearch会自动使用"ik_max_word"这个Field对搜索关键字进行相应的处理,然后进行检索。
## 4. 总结
Analyzer(分析器)是Elasticsearch中的一个核心组件。它负责对文本内容进行预处理、分词和过滤,最终将处理后的词元存入倒排索引,以供快速的全文检索。Analyzer在实际开发中,可以使用内置的分析器,也可以在需要的情况下,开发自己的分析器,以最大限度地满足自己的需求。上述章节从原理、使用方法和案例等三个方面进行了详细的讲解,希望能对读者的学习和实践有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
发表评论 取消回复