索引
创建索引
语法:1
2
3
4
5
6
7
8
9
10
11
12
13
14PUT /index
{
"settings":{
// any settings...
},
"mappings":{
type1:{
// any settings...
},
type2:{
// any settings...
}
}
}
示例:
1 | PUT /my_index |
修改索引
语法:1
2
3
4PUT /index/_settings
{
// any settings
}
示例:1
2
3
4PUT /my_index/_settings
{
"number_of_replicas": 1 // 修改replica shard 的数量
}
删除索引
1 | DELETE /index |
在elasticsearch.yml中设置action.destructive_requires_name: true,以后就不能使用 _all删除全部了
分词器
修改分词器
之前我们说过,es默认的分词器就是standard,他做了以下几件事:
standard tokenizer:以单词边界进行切分
standard token filter:什么都不做
lowercase token filter:将所有字母转换为小写
stop token filer(默认被禁用):移除停用词,比如a the it等等
我们先来新建一个索引,并启用english stop token filer1
2
3
4
5
6
7
8
9
10
11
12
13PUT /my_index
{
"settings": {
"analysis": { // 分词器相关
"analyzer": { // 分词器
"es_std":{ // 自定义名称
"type":"standard", // 分词器类型
"stopwords":"_english_"
}
}
}
}
}
执行成功后我们用之前说的测试分词器的方法来测试一下
1 | GET /my_index/_analyze |
返回结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18{
"tokens": [
{
"token": "dog",
"start_offset": 2,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "house",
"start_offset": 16,
"end_offset": 21,
"type": "<ALPHANUM>",
"position": 5
}
]
}
可以看到停用词已经被去掉了
定制自己的分词器
我们先把创建的这个索引删除掉1
DELETE /my_index
然后手动定制分词器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": { // 字符转换
"&_to_and":{
"type":"mapping",
"mappings":["& => and "] //& 转成 and
}
},
"filter": {
"my_stop_words":{ // 自定义停用词过滤
"type":"stop",
"stopwords":["the","a"] // 要过滤的词
}
},
"analyzer": {
"my_analyzer":{ // 自定义名称
"type":"custom",
"char_filter":["html_strip","&_to_and"], // html脚本过滤和上面定义的&_to_and
"tokenizer":"standard",
"filter":["lowercase","my_stop_words"] // 大小写转换 和 上面定义的停用词过滤
}
}
}
}
}
执行完毕后来测试一下
1 | GET /my_index/_analyze |
返回值:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46{
"tokens": [
{
"token": "tomandjerry",
"start_offset": 0,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "are",
"start_offset": 10,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "friend",
"start_offset": 16,
"end_offset": 22,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "in",
"start_offset": 23,
"end_offset": 25,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "house",
"start_offset": 30,
"end_offset": 35,
"type": "<ALPHANUM>",
"position": 6
},
{
"token": "haha",
"start_offset": 42,
"end_offset": 46,
"type": "<ALPHANUM>",
"position": 7
}
]
}
a the 这两个停用词被去掉了,&也转为and了,a标签被过滤掉,最后的大写也转成了小写
使用自定义分词器
上面我们自定义的分词器已经可以使用了,那么如何让type中的某个filed来使用我们自定义的分词器1
2
3
4
5
6
7
8
9PUT /my_index/_mapping/my_type
{
"properties": {
"content":{ // field名称
"type": "text",
"analyzer": "my_analyzer" // 分词器名称
}
}
}