1.5.2 什么是Analyzer--分析器

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/

点赞(80) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部