ES 分词器使用和配置

1 介绍

主要介绍索引请求的基础API操作,使用postman进行请求,接口请求的前缀地址统一为elasticsearch 部署IP地址+端口号(例如 http://192.168.51.4:9200 。

2 内置分词器

分词器 介绍
Standard Analyzer 默认分词器,按词切分,小写处理
Simple Analyzer 按照非字母切分(符号被过滤), 小写处理
Stop Analyzer 小写处理,停用词过滤(the,a,is)
Whitespace Analyzer 按照空格切分,不转小写
Keyword Analyzer 不分词,直接将输入当作输出
Patter Analyzer 正则表达式,默认\W+(非字符分割)
Language 提供了30多种常见语言的分词器
Customer Analyzer 自定义分词器

2.1 Standard Analyzer

standard 是默认的分析器。它提供了基于语法的标记化(基于Unicode文本分割算法),适用于大多数语言

2.1.1 示例

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "standard",
  "text":     "Tic is a 善良的好人 "
}

请求结果

{
    "tokens": [
        {
            "token": "tic",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "is",
            "start_offset": 4,
            "end_offset": 6,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 7,
            "end_offset": 8,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "善",
            "start_offset": 9,
            "end_offset": 10,
            "type": "<IDEOGRAPHIC>",
            "position": 3
        },
        {
            "token": "良",
            "start_offset": 10,
            "end_offset": 11,
            "type": "<IDEOGRAPHIC>",
            "position": 4
        },
        {
            "token": "的",
            "start_offset": 11,
            "end_offset": 12,
            "type": "<IDEOGRAPHIC>",
            "position": 5
        },
        {
            "token": "好",
            "start_offset": 12,
            "end_offset": 13,
            "type": "<IDEOGRAPHIC>",
            "position": 6
        },
        {
            "token": "人",
            "start_offset": 13,
            "end_offset": 14,
            "type": "<IDEOGRAPHIC>",
            "position": 7
        }
    ]
}

区分中英文,英文按照空格切分,同时大写转小写。

中文按照单个词分词。

2.1.2 配置

标准分析器接受下列参数:

  • max_token_length : 最大token长度,默认255
  • stopwords : 预定义的停止词列表,如_english_或 包含停止词列表的数组,默认是 _none_
  • stopwords_path : 包含停止词的文件路径
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard",       #设置分词器为standard
          "max_token_length": 5,    #设置分词最大为5
          "stopwords": "_english_"  #设置过滤词
        }
      }
    }
  }
}

2.2 Simple Analyzer

simple 分析器当它遇到只要不是字母的字符,就将文本解析成term,而且所有的term都是小写的

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "simple",
  "text":     "Tic is a 善良的好人 "
}

请求结果

{
    "tokens": [
        {
            "token": "tic",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0
        },
        {
            "token": "is",
            "start_offset": 4,
            "end_offset": 6,
            "type": "word",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 7,
            "end_offset": 8,
            "type": "word",
            "position": 2
        },
        {
            "token": "善良的好人",
            "start_offset": 9,
            "end_offset": 14,
            "type": "word",
            "position": 3
        }
    ]
}

先按照空格分词,英文大写转小写,不是英文不在分词

2.3 Whitespace Analyzer

按照空格分词

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "whitespace",
  "text":     "Tic is a 善良的好人 "
}

请求结果

{
    "tokens": [
        {
            "token": "Tic",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0
        },
        {
            "token": "is",
            "start_offset": 4,
            "end_offset": 6,
            "type": "word",
            "position": 1
        },
        {
            "token": "a",
            "start_offset": 7,
            "end_offset": 8,
            "type": "word",
            "position": 2
        },
        {
            "token": "善良的好人",
            "start_offset": 9,
            "end_offset": 14,
            "type": "word",
            "position": 3
        }
    ]
}

按空格分词,英文不区分大小写,中文不再分词

3 中文分词器

中文分词器经常被使用的就是IK分词器

3.1 IK分词器下载

Github下载地址: https://github.com/medcl/elasticsearch-analysis-ik

CSDN下载地址: https://download.csdn.net/download/qq_15769939/15465684

3.2 IK分词器安装

将下载下来的文件,上传到服务的 /opt/module/software/ 目录下

[root@localhost ~]# cd /opt/module/software/
[root@localhost software]# ll
总用量 289356
-rw-r--r--. 1 root   root   288775500 2月  22 21:45 elasticsearch-7.4.2-linux-x86_64.tar.gz
-rw-r--r--. 1 root   root     4504487 2月  24 13:30 elasticsearch-analysis-ik-7.4.2.zip

[root@localhost software]# unzip elasticsearch-analysis-ik-7.4.2.zip -d /usr/local/elasticsearch-7.4.2/plugins/
[root@localhost software]# cd /usr/local/elasticsearch-7.4.2/
[root@localhost elasticsearch-7.4.2]# su esuser
[esuser@localhost elasticsearch-7.4.2]$ jps
28194 Jps
26740 Elasticsearch
[esuser@localhost elasticsearch-7.4.2]$ kill -9 26740


[root@localhost software]# cd /usr/local/elasticsearch-7.4.2/
[esuser@localhost elasticsearch-7.4.2]$ cd bin
[esuser@localhost bin]$ ./elasticsearch -d

如果jps查看的进程中有elasticsearh服务就kill掉,如果不存在直接启动elasticsearch就行

3.3 IK分词器使用

IK有两种颗粒度的拆分:

ik_smart: 会做最粗粒度的拆分

ik_max_word: 会将文本做最细粒度的拆分

3.3.1 ik_smart 拆分

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "ik_smart",
  "text":     "这个世界上的好人和坏人都是存在的"
}

请求结果

{
    "tokens": [
        {
            "token": "这个",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "世界上",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "的",
            "start_offset": 5,
            "end_offset": 6,
            "type": "CN_CHAR",
            "position": 2
        },
        {
            "token": "好",
            "start_offset": 6,
            "end_offset": 7,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "人和",
            "start_offset": 7,
            "end_offset": 9,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "坏人",
            "start_offset": 9,
            "end_offset": 11,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "都是",
            "start_offset": 11,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "存在",
            "start_offset": 13,
            "end_offset": 15,
            "type": "CN_WORD",
            "position": 7
        },
        {
            "token": "的",
            "start_offset": 15,
            "end_offset": 16,
            "type": "CN_CHAR",
            "position": 8
        }
    ]
}

3.3.2 ik_max_word 拆分

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "ik_max_word",
  "text":     "这个世界上的好人和坏人都是存在的"
}

请求结果

{
    "tokens": [
        {
            "token": "这个",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "世界上",
            "start_offset": 2,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "世界",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "上",
            "start_offset": 4,
            "end_offset": 5,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "的",
            "start_offset": 5,
            "end_offset": 6,
            "type": "CN_CHAR",
            "position": 4
        },
        {
            "token": "好人",
            "start_offset": 6,
            "end_offset": 8,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "人和",
            "start_offset": 7,
            "end_offset": 9,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "坏人",
            "start_offset": 9,
            "end_offset": 11,
            "type": "CN_WORD",
            "position": 7
        },
        {
            "token": "都是",
            "start_offset": 11,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 8
        },
        {
            "token": "存在",
            "start_offset": 13,
            "end_offset": 15,
            "type": "CN_WORD",
            "position": 9
        },
        {
            "token": "的",
            "start_offset": 15,
            "end_offset": 16,
            "type": "CN_CHAR",
            "position": 10
        }
    ]
}

3.4 自定义中文词库

3.4.1 设置自定义词库

[root@localhost config]# vi /usr/local/elasticsearch-7.4.2/plugins/ik/config/IKAnalyzer.cfg.xml 

设置自定义词库位置

<entry key="ext_dict">custom.dic<entry>
[root@localhost config]# vi /usr/local/elasticsearch-7.4.2/plugins/ik/config/custom.dic
吞噬星空
大主宰
老干妈
[root@localhost config]# /usr/local/elasticsearch-7.4.2/bin/elasticsearch -d

3.4.2 自定义分词器示例

请求方式 接口地址 备注
POST /analyze_demo/_analyze analyze_demo 索引的名称

传递JSON数据

{
  "analyzer": "ik_max_word",
  "text":     "我喜欢吃老干妈,喜欢看吞噬星空和大主宰"
}

请求结果

{
    "tokens": [
        {
            "token": "我",
            "start_offset": 0,
            "end_offset": 1,
            "type": "CN_CHAR",
            "position": 0
        },
        {
            "token": "喜欢吃",
            "start_offset": 1,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "喜欢",
            "start_offset": 1,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "吃",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "老干妈",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "干妈",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "喜欢",
            "start_offset": 8,
            "end_offset": 10,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "看",
            "start_offset": 10,
            "end_offset": 11,
            "type": "CN_CHAR",
            "position": 7
        },
        {
            "token": "吞噬星空",
            "start_offset": 11,
            "end_offset": 15,
            "type": "CN_WORD",
            "position": 8
        },
        {
            "token": "吞噬",
            "start_offset": 11,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 9
        },
        {
            "token": "星空",
            "start_offset": 13,
            "end_offset": 15,
            "type": "CN_WORD",
            "position": 10
        },
        {
            "token": "和",
            "start_offset": 15,
            "end_offset": 16,
            "type": "CN_CHAR",
            "position": 11
        },
        {
            "token": "大主宰",
            "start_offset": 16,
            "end_offset": 19,
            "type": "CN_WORD",
            "position": 12
        },
        {
            "token": "主宰",
            "start_offset": 17,
            "end_offset": 19,
            "type": "CN_WORD",
            "position": 13
        }
    ]
}

4 相关信息

  • 博文不易,辛苦各位猿友点个关注和赞,感谢
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容