文章目录
-
-
- 思维导图
- [0. 前言](#0. 前言)
- [1. 光速上手](#1. 光速上手)
-
- [1.1 指定分词器](#1.1 指定分词器)
- [1.2 测试分词器](#1.2 测试分词器)
- [2. 分词流程(重要)](#2. 分词流程(重要))
-
- [2.1 基本介绍](#2.1 基本介绍)
- [2.2 深入如何测试分词器](#2.2 深入如何测试分词器)
- [3. 自定义一个简单的分词器](#3. 自定义一个简单的分词器)
-
思维导图
0. 前言
分词器在 ES 搜索使用中非常关键,一个好的分词器能够提高搜索的质量,让用户搜索到其想要的内容。
下面我将带大家从整体了解分词器。
1. 光速上手
1.1 指定分词器
DELETE test8
PUT test8
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
test8 索引的 title 字段,分词器为 whitespace
1.2 测试分词器
POST _analyze
{
"analyzer": "whitespace",
"text": "hello world"
}
2. 分词流程(重要)
2.1 基本介绍
ES 分词可以包含:
- 0个或多个 character filters
- 有且仅 1 个 tokenizer
- 0个或多个 token filters
工作流程如下:
- character filters: 对输入进行预处理,比如删除 html 元素,比如将表情符号映射为文本
- tokenizer: 分词器,上面说到的
standard
,whitespace
都属于分词器 - token filters: 对分词后的结果进行处理。例如输入
Is this déja vu
, 如果按照空格分词的话,会被分为Is
,this
,déja
,vu
。我们可以设置asciifolding
token filters, 将déja
, 转换为deja
。
2.2 深入如何测试分词器
POST _analyze
{
"char_filter": ["html_strip", {
"type": "mapping",
"mappings": [
"😂 => happy"
]
}],
"tokenizer": "standard",
"filter": ["lowercase", "asciifolding"],
"text": "Is this déja vu? 😂 <b>Important</b>"
}
- html_strip 用于去掉 html 元素
- mapping 则是将表情转换为文本
- standard 用于分词
- lowercase 用于将所有的大写转换为小写
- asciifolding 用于将 Unicode 字符转换为 ASCII 字符
json
{
"tokens" : [
{
"token" : "is",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "this",
"start_offset" : 3,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "deja",
"start_offset" : 8,
"end_offset" : 12,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "vu",
"start_offset" : 13,
"end_offset" : 15,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "happy",
"start_offset" : 17,
"end_offset" : 19,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}
3. 自定义一个简单的分词器
DELETE test8
PUT test8
{
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_custom_analyzer"
}
}
},
"settings": {
"analysis": {
"char_filter": {
"cf_happy": {
"type": "mapping",
"mappings": ["😂 => happy"]
}
},
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": ["html_strip", "cf_happy"],
"filter": ["lowercase", "asciifolding"]
}
}
}
}
}
测试分词器
POST test8/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "😂 I Like Elasticsearch"
}
输出结果
{
"tokens" : [
{
"token" : "happy",
"start_offset" : 0,
"end_offset" : 2,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "i",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "like",
"start_offset" : 5,
"end_offset" : 9,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "elasticsearch",
"start_offset" : 10,
"end_offset" : 23,
"type" : "<ALPHANUM>",
"position" : 3
}
]
}