创建索引

创建索引的时候指定分片的个数:

1
2
3
4
5
http put :9200/indexsetting number_of_shards=1 number_of_replicas=1

{
"acknowledged": true
}

映射配置

在我们手动配置映射之前,Elasticsearch 可以通过 json 来猜测文档结构当中的字段的类型。如下例子:

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
http post :9200/test/auto field1='20' field:=10

{
"_id": "AVHNbr0WRh7yMB73pVgC",
"_index": "test",
"_shards": {
"failed": 0,
"successful": 1,
"total": 2
},
"_type": "auto",
"_version": 1,
"created": true
}

http :9200/test/auto/_mapping

{
"test": {
"mappings": {
"auto": {
"properties": {
"field": {
"type": "long"
},
"field1": {
"type": "string"
}
}
}
}
}
}

可以看到 field 的类型是 long。当然我们也可以在创建索引的时候指定 numeric_detection 参数为 true 以开启更积极的文本检测。

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
//创建类型 notauto 的 mapping
http put :9200/test/_mapping/notauto notauto:='{"numeric_detection":true}'

{
"acknowledged": true
}

//添加文档
http post :9200/test/notauto f1='10' f2='20'
{
"_id": "AVHNeiW1Rh7yMB73pVgG",
"_index": "test",
"_shards": {
"failed": 0,
"successful": 1,
"total": 2
},
"_type": "notauto",
"_version": 1,
"created": true
}

//查看字段类型
http :9200/test/notauto/_mapping
{
"test": {
"mappings": {
"notauto": {
"numeric_detection": true,
"properties": {
"f1": {
"type": "long"
},
"f2": {
"type": "long"
}
}
}
}
}
}

但是有个问题就是我们不能从强文本当中推测出布尔值,我们只能在映射定义中直接定义字段。

另外的一个类型是日期类型,我们也可以指定 “dynamic_date_formats” : [“yyyy-MM-dd hh:mm”] 这个参数可以接收的是一个数组。

禁止字段类型猜想

要关闭自动添加字段,可以把 dynamic 属性设置成 false。

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
http put :9200/test/_mapping/my my:='{"dynamic":false,"properties":{"ff1":{"type":"string"},"ff2":{"type":"string"}}}'

{
"acknowledged": true
}

http :9200/test/my/_mapping

{
"test": {
"mappings": {
"my": {
"dynamic": "false",
"properties": {
"ff1": {
"type": "string"
},
"ff2": {
"type": "string"
}
}
}
}
}
}

索引结构映射

如下例子:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
cat posts.json

{
"mappings":{
"post": {
"properties": {
"id" : {
"type":"long",
"store":"yes",
"precision_step":"0"
},
"name" : {
"type":"string",
"store":"yes",
"index":"analyzed"
},
"published" : {
"type":"date",
"store":"yes",
"precision_step":"0"
},
"contents" : {
"type":"string",
"store":"no",
"index":"analyzed"
}
}
}
}
}

http put :9200/posts < posts.json

{
"acknowledged": true
}

http :9200/posts/_mapping

{
"posts": {
"mappings": {
"post": {
"properties": {
"contents": {
"type": "string"
},
"id": {
"precision_step": 1,
"store": true,
"type": "long"
},
"name": {
"store": true,
"type": "string"
},
"published": {
"format": "strict_date_optional_time||epoch_millis",
"precision_step": 1,
"store": true,
"type": "date"
}
}
}
}
}
}

核心类型

  • string
  • number
  • date
  • boolean
  • binary

每个类型的公共属性

  • index_name:定义存储到索引中字段的名称,未定义则使用字段的名字
  • index:可以设置 analyzed 或 no,字符串类型还可以设置成 not_analyzed。设置成 analyzed 该字段被编入搜索以提供搜索。如果设置成 no,将无法搜索该字段。默认是 analyzed,如果字符串类型设置成 not_analyzed,那么意味着字段不经过分析直接编入索引,搜索的时候进行全匹配。
  • store:yes 或者 no,表示是否被写入索引。
  • boost:默认值是 1。定义了文档中该字段的重要性,值越高越重要。
  • null_value:如果该字段不是索引的一部分,那么属性的值指定写入索引的值。默认忽略该字段。
  • copy_to:指定一个字段,字段的所有值都将复制到该指定字段。
  • include_in_all:此属性指定该字段是否应包括在_all字段当中,默认的情况所有字段都会包含在_all当中。

字符串类型

字符串类型还可以使用如下属性:

  • term_vector:此属性可以设置成 no、yes、with_offsetswith_positionswith_positions_offsets。定义是否计算该字段的 lucene 词向量,如果使用高亮,那就需要计算这个词向量。
  • omit_norms:该属性可以设置为 true 和 false。对于经过分析的字符串字段,默认值为 false,而对于未经过分析但已经存入索引的字符串字段,默认设置为 true。当属性为 true 的时候,禁止 lucene 对该字段的加权计算。
  • analyzer:定义索引和搜索的分析器名称。
  • index_analyzer:该属性定义创建索引的分析器名称。
  • search_analyer:定义查询时候的分析器名称。
  • norms.enabled:字段加权基准。默认是 true,未分析字段是 false。
  • norms.loading:可以设置成 eager 或 lazy。eager 表示此字段总是加载加权基准。lazy 是指定时候才加载。

数字类型

  • byte
  • short
  • integer
  • long
  • float
  • double

IP地址类型

可以把字段设置 ip 类型,来存放 ip 数据

批量操作

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
cat bulk.json

{"index":{"_index":"test", "_type":"bulk"}}
{ "name":"rcx", "age":14}
{"index":{"_index":"test", "_type":"bulk"}}
{ "name":"rcx1", "age":28}

http post :9200/test/bulk/_bulk < bulk.json
{
"errors": false,
"items": [
{
"create": {
"_id": "AVHOPSjBRh7yMB73pVgS",
"_index": "test",
"_shards": {
"failed": 0,
"successful": 1,
"total": 2
},
"_type": "bulk",
"_version": 1,
"status": 201
}
},
{
"create": {
"_id": "AVHOPSjBRh7yMB73pVgT",
"_index": "test",
"_shards": {
"failed": 0,
"successful": 1,
"total": 2
},
"_type": "bulk",
"_version": 1,
"status": 201
}
}
],
"took": 23
}

索引内部信息

每个文档都有自己的标识符和类型。文档存在两种内部标识符。

  • _uid:是索引中文档的唯一标识符,由文档的标识符和类型构成,此字段不需要设置,总是被索引。
  • _id:实际标识符,一般创建文档是时候会传入,如果不传入会自动生成一个。

_type 字段

默认情况下文档的类型也会编入索引,但是不会被分析也不会被存储。

_all 字段

Elasticsearch 使用 _all 字段来存储其他字段中的数据便于搜索。当要执行简单的搜索功能,搜索所有数据,但是有不想去考虑字段名称之类的事情,这个字段很有用。默认情况下,_all 是启用的。_all 字段也可以完全禁止,或者排除某些字段。需要如下修改:

1
2
3
4
5
6
7
8
9
10
{
"book" : {
"_all" : {
"enabled" : "false"
},
"properties" : {
...
}
}
}

_source 字段

该字段存储原始 json 文档。默认情况下是开启的。如果不需要这个功能可以禁止,与 _all 禁止的方式相同。

_index 字段

存储文档的索引信息。

_size 字段

默认不开启,这个字段使我们可以自动索引 _source 字段的原始大小,并且与文件一起存储。

_timestamp字段

_ttl 字段

time to live,它允许定义文档的生命周期,周期结束后文档被自动删除。默认禁止此属性。

【参考资料】

  1. Elasticsearch服务器开发

—EOF—