前言

本文基于elasticsearch7.3.0版本

分析就是将文本(例如电子邮件的正文)转换为tokens或terms的过程, 然后将它们添加到倒排索引中以便进行搜索。

本文内容包括:

Elasticsearch-分析器详解_中文分词

测试分析器

创建索引

PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"analyzer": "pinyin"
}
}
}
}

测试分词

## 不指定索引, 指定分析器
POST _analyze
{
"text": ["中文分词测试"],
"analyzer": "ik_smart"
}

## 不指定索引, 自定义分析器
POST _analyze
{
"text": ["中文分词测试"],
"char_filter": [],
"tokenizer": "ik_smart",
"filter": []
}

## 指定索引, 指定分析器
POST analyzer_test/_analyze
{
"text": ["中文分词测试"],
"analyzer": "ik_smart"
}

## 指定索引, 指定字段
POST analyzer_test/_analyze
{
"text":["中文分词测试"],
"field": "desc"
}

查看分词效果

{
"tokens" : [
{
"token" : "中文",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "分词",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "测试",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
}
]
}

分析器-索引时分析

优先级如下
1.mappings中text字段指定的analyzer

PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"analyzer": "pinyin"
}
}
}
}

2.前面一步没有找到,索引设置中名为default的分析器

PUT analyzer_test
{
"settings": {
"analysis": {
"analyzer": {
"default":{
"type":"ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

3.前面一步没有找到,默认使用standard分析器(内置)

PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

分析器-查询时分析

优先级如下
1.查询中指定的分析器

## 创建索引
PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

## 索引一条文档
PUT analyzer_test/_doc/1
{
"desc":"中文分词测试"
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": {
"query": "中文",
"analyzer": "pinyin"
}
}
}
}

2.前面一步没有找到,mappings中这个字段的search_analyzer

## 索引
PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"search_analyzer": "ik_smart"
}
}
}
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": "中文"
}
}
}

3.前面一步没有找到,mappings中这个字段的analyzer

## 索引
PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"analyzer": "ik_smart"
}
}
}
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": "中文"
}
}
}

4.前面一步没有找到,索引设置中名为default_search的分析器

## 索引
PUT analyzer_test
{
"settings": {
"analysis": {
"analyzer": {
"default_search":{
"type":"pinyin"
}
}
}
},
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": "中文"
}
}
}

5.前面一步没有找到,索引设置中名为default的分析器

## 索引
PUT analyzer_test
{
"settings": {
"analysis": {
"analyzer": {
"default":{
"type":"ik_max_word"
}
}
}
},
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": "中文"
}
}
}

6.前面一步没有找到,默认使用standard分析器(内置)

PUT analyzer_test
{
"mappings": {
"properties": {
"desc":{
"type": "text"
}
}
}
}

## 查询
GET analyzer_test/_search
{
"query": {
"match": {
"desc": "中文"
}
}
}

分析器组成

一个分析器,不管是内置的还是自定义的,都是由三个部分组成:字符过滤器,分词器,token过滤器
字符过滤器-character filters
官方文档:​​​Elasticsearch字符过滤器​​​ 一个分析器有0个或多个字符过滤器,按照顺序使用
作用:字符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换流。
例子:去除html标签;把’&‘转换成’且’

分词器-tokenizer
官方文档:​​​Elasticsearch分词器​​​ 一个分析器有且仅有一个分词器
作用:分词器接收字符流,将其分解为单个字符。
分词器还负责记录每个token的位置,开始和结束的字符偏移量

{
"token" : "测试",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 2
}

token过滤器-token filters
官方文档:​​​Elasticsearchtoken过滤器​​​ 一个分析器有0个或多个token过滤器,按照顺序使用
作用:token过滤器接收token流,并可以添加、删除或更改token。
例子:lowercase token过滤器将所有token转换为小写
注意:token过滤器不允许更改每个token的位置或者字符偏移量

elasticsearch内置分析器

基本很少使用, 详情请参考官方文档:​​Elasticsearch分析器​

自定义分析器

如果找不到适合的分析器,则可以创建custom分析器,实际情况中使用较多

模板

{
"settings":{
"analysis":{
"analyzer":{
"analyzer_name":{
"type":"custom",
"char_filter":[],
"tokenizer":"",
"filter":[]
}
},
"char_filter":{},
"tokenizer":{},
"filter":{}
}
}
}

例子

## 创建索引
PUT analyzer_test
{
"settings":{
"analysis":{
"analyzer":{
"ik_pinyin_analyzer":{
"type":"custom",
"char_filter":[
"emoticons"
],
"tokenizer":"ik_max_word",
"filter":[
"pinyin_filter"
]
}
},
"char_filter":{
"emoticons":{
"type":"mapping",
"mappings":[
":) => _happy_",
":( => _sad_"
]
}
},
"tokenizer":{
"punctuation":{
"type":"pattern",
"pattern":"[ .,!?]"
}
},
"filter":{
"pinyin_filter":{
"type":"pinyin",
"keep_original":true
}
}
}
},
"mappings":{
"properties":{
"desc":{
"type":"text",
"analyzer":"ik_pinyin_analyzer"
}
}
}
}

测试分析器

## 指定索引, 指定字段
POST analyzer_test/_analyze
{
"text": [":) :(中文分词测试"],
"field": "desc"
}

常用中文分析器

ElasticSearch学习 - (八)安装中文分词器IK和拼音分词器