ES实践笔记,elasticsearch分词器详解

一,基本概念

Analysis,分词,是把全文本转换成一个个的单词的过程                                                

anaylyzer,分词器,专门处理分词的组件,有三部分组成:                                             

(1)Character filters,原始文本的预处理,通常完成HTML元素删除,替换指定字符等功能;                                                          

(2)Tokenizer,分词,按照预设的规则切分文本                                                      

(3)Token filter,切分后处理,例如大小写转换,删除停用词/stopwords,增加同义词

ES实践笔记,elasticsearch分词器详解_第1张图片

在上面的三部分中,tokenizer有且只有一个,character filters & token filters可以有多个或零个。

二,内置分词器

Elasticsearch内置的分词器:standard,simple,stop,whitespace,keyword,pattern,customer等。

这些分词器的对比见官网说明:

https://www.elastic.co/guide/en/elasticsearch/reference/master/analysis-analyzers.html

下表是个简单的概要

analyzer

Tokenizer

Token Filters

Configuration

 

standard

Standard

Lower case
Stop

max_token_length
stopwords
stopwords_path

基于语法的分词

Simple

Simple

Lower case

 

非字母的分词

Whitespace

Whitespace

 

 

空格分词

Stop

Lower case

Stop

stopwords
stopwords_path

类似simple

Keyword

Keyword

 

 

不'分词

Pattern

Pattern

Lower Case
Stop

pattern
flags
lowercase
stopwords
stopwords_path

按表达式分词

Language

Language

keyword marker

 

其他语言分词

Fingerprint

Standard

lower case
ASCII folding
Stop
Fingerprint

separator
max_output_size
stopwords
stopwords_path

检查重复

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三,自定义分词器

另外,非常常用的一种分词器是自定义分词器。可以自定义character filter,tokenizer和token filter来实现。通常实际工作中,需要根据自己的需要来实现自定义的分词器,这就需要把实际问题分解,之后分别在character filters或token filter中实现。

例如,我的日志中,有的命令格式如下:“component:;Django;es;Redis;”,:-D,那么自定义的分词器的核心要求是:

  1. 大小写转换,这个需要在token filter中实现
  2. 以分号分词,这个需要在tokenizeer实现
  3. ES就是elastic search,这个需要在token filter中实现
  4. 过滤冒号,这个在character filter中实现

自定义的分词器如下:

put my_index1 {
	"settings": {
		"analysis": {
			"char_filter": {
				"my_char_filter": {
					"type": "mapping",
					"mappings": [": => "]
				}
			},
			"filter": {
				"my_synonym_filter": {
					"type": "synonym",
					"expand": true,
					"synonyms": ["es => elasticsearch", ]
				}
			},
			"analyzer": {
				"my_analyzer": {
					"tokenizer": "my_tokenizer",
					"char_filter": ["my_char_filter"],
					"filter": ["my_synonym_filter", "lowercase"]
				}
			},
			"tokenizer": {
				"my_tokenizer": {
					"type": "pattern",
					"pattern": "\\;"
				}
			}
		}
	},
	"mappings": {
		"properties": {
			"text": {
				"type": "text",
				"analyzer": "my_analyzer"
			}
		}
	}
}

验证这个分词器:

GET my_index1/_analyze

{

  "analyzer": "my_analyzer",

  "text":     "component:;es;Django;Redis"

}

结果如下,可以看到分词的结果满足了需求

ES实践笔记,elasticsearch分词器详解_第2张图片

你可能感兴趣的:(elasticsearch,elasticsearch)