第六章 索引的创建
6.1 语法
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
创建索引的请求格式:
-
请求方式:PUT
-
请求路径:/索引库名
-
请求参数:json格式:
{ "settings": { "number_of_shards": 3, "number_of_replicas": 2 } }
- settings:索引库的设置
- number_of_shards:分片数量
- number_of_replicas:副本数量
FAQ 分片的大小和数量怎么设定?
提示1:避免有非常大的分片,因为大的分片可能会对集群从故障中恢复的能力产生负面影响。 对于多大的分片没有固定的限制,但是分片大小为50GB通常被界定为适用于各种用例的限制。
提示2:可以在集群节点上保存的分片数量与可用的堆内存大小成正比,但这在Elasticsearch中没有的固定限制。 一个很好的经验法则是:确保每个节点的分片数量保持在低于每1GB堆内存对应集群的分片在20-25之间。 因此,具有30GB堆内存的节点最多可以有600-750个分片,但是进一步低于此限制,您可以保持更好。 这通常会帮助群体保持处于健康状态。
- settings:索引库的设置
6.2 测试
http://192.168.82.188:9200/qf
我们先用postman测试来试试
可以看到索引创建成功了。
6.3 使用kibana创建
kibana的控制台,可以对http请求进行简化,示例:
相当于是省去了elasticsearch的服务器地址
而且还有语法提示,非常舒服。
6.4 查看索引设置
语法
Get请求可以帮我们查看索引信息,格式:
GET /索引库名
或者,我们可以使用*来查询所有索引库配置:
6.5 删除索引
删除索引使用DELETE请求
语法
DELETE /索引库名
当然,我们也可以用HEAD请求,查看索引是否存在:
HEAD qianfeng
6.6 映射配置
索引有了,接下来肯定是添加数据。但是,在添加数据之前必须定义映射。
什么是映射?
映射是定义文档的过程,文档包含哪些字段,这些字段是否保存,是否索引,是否分词等
只有配置清楚,Elasticsearch才会帮我们进行索引库的创建(不一定)
6.7 创建映射字段
语法
请求方式依然是PUT
PUT /索引库名/_mapping/类型名称
{
"properties": {
"字段名": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
}
}
}
put /qf/_mapping/tb_item{
"properties":{
"type":
"index":
"store":
}
}
- 类型名称:就是前面讲的type的概念,类似于数据库中的不同表
字段名:任意填写 ,可以指定许多属性,例如: - type:类型,可以是text、long、short、date、integer、object等
- index:是否索引,默认为true
- store:是否存储,默认为false
- analyzer:分词器,这里的
ik_max_word
即使用ik分词器
示例
发起请求:
POST qf/_mapping/items
{
"properties":
{
"title":{
"type":"text",
"analyzer":"ik_max_word"
},
"sellpoint":{
"type": "text",
"index":true,
"store": true
}
,
"images":{
"type":"keyword",
"index":false
},
"price":{
"type":"float"
}
}
}
响应结果:
{
"acknowledged": true
}
6.8 查看映射关系
语法:
GET /索引库名/_mapping
示例:
GET /qf/_mapping
响应:
{
"qf": {
"mappings": {
"items": {
"properties": {
"images": {
"type": "keyword",
"index": false
},
"price": {
"type": "float"
},
"sellpoint": {
"type": "text",
"store": true
},
"title": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}
}
6.9 字段属性详解
6.9.1 type
Elasticsearch中支持的数据类型非常丰富:
我们说几个关键的:
-
String类型,又分两种:
- text:可分词,不可参与聚合
- keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
-
Numerical:数值类型,分两类
- 基本数据类型:long、interger、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
- 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
-
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
-
boolean
设置字段类型为boolean后,可以填入的值为:true、false、“true”、“false”。
- binary
binary类型接受base64编码的字符串。
-
geo point
地理点类型用于存储地理位置的经纬度对
其它的不再一一讲解,用的不多,大家参考官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping-types.html
6.9.2 index
index影响字段的索引情况。
- true:字段会被索引,则可以用来进行搜索。默认值就是true
- false:字段不会被索引,不能用来搜索
index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
6.9.3 store
是否将数据进行额外存储。
在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。
但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。
原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source
的属性中。而且我们可以通过过滤_source
来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source
以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。
6.9.4 boost
激励因子,这个与lucene中一样,我们可以通过指定一个boost值来控制每个查询子句的相对权重,该值默认为1。一个大于1的boost会增加该查询子句的相对权重,如下所示:
GET/_search{
"query": {
"bool": {
"must": {
"match": {
"content": {
"query": "full text search",
"operator": "and"
}
}
},
"should": [{
"match": {
"content": {
"query": "Elasticsearch",
"boost": 3
}
}
},
{
"match": {
"content": {
"query": "Lucene",
"boost": 2
}
}
}]
}
}
}
6.9.5 analyzer
定义的是该字段的分析器,默认的分析器是 standard 标准分析器,这个地方可定义为自定义的分析器。比如IK分词器为:ik_max_word
6.10 学生实习题
某短信平台发送短信的下发表字段如下所示:
字段名称 | 备注 |
---|---|
createDate | 创建时间 |
sendDate | 发送时间 |
longCode | 发送的长号码,如“1069886622” |
mobile | 如:13800000000 |
corpName | 发送公司名称,需要分词检索 |
smsContent | 下发短信内容,需要分词检索 |
state | 短信下发状态 0 成功 1 失败 |
operatorId | 运营商编号 1 移动 2 联通 3 电信 |
province | 省份 |
ipAddr | 下发服务器IP地址 |
replyTotal | 短信状态报告返回时长(秒) |
fee | 扣费(分) |
请根据上面的表设计出索引结构。
完整代码:https://github.com/chutianmen/elasticsearch-examples