租房网站模板,女装小说WordPress,百度文库官网,网站申请免费ElasticSearch入门到实战教程#xff1a;点击查看
1. 对象类型#xff08;object#xff09;
一个字段下需要多种类型的属性字段#xff0c;属性 attr 有身高、体重#xff0c;添加映射语句如下#xff1a;
POST indexname/_mapping
{properties: {…ElasticSearch入门到实战教程点击查看
1. 对象类型object
一个字段下需要多种类型的属性字段属性 attr 有身高、体重添加映射语句如下
POST indexname/_mapping
{properties: {attr: {properties: {height: {type: double},weight: {type: double}}}}
}对象类型新增数据语法
PUT indexname/_doc/1
{attr: {height: 176.3,weight: 64}
}筛选查询新增的数据
GET indexname/_search
{query:{term:{attr.weight: 64}}
}2. 数组类型
ELasticsearch没有专用的数组类型默认情况下任何字段都可以包含一个或者多个值但是一个数组中的值要是同一种类型。
字符数组: [ “one”, “two” ]整型数组[1,3]对象数组[ { “name”: “长度”, “value”: “10” }, { “name”: “内存”, “value”: “16” }]
keyword数组创建keyword字段
POST indexname/_mapping
{properties: {skills: {type: keyword}}
}新增数据
PUT indexname/_doc/2
{skills: [java, c]
}对象数组创建对象字段
POST indexname/_mapping
{properties: {attrs: {properties: {name: {type: keyword},value: {type: keyword}}}}
}新增数据
PUT indexname/_doc/3
{attrs: [{name: 长度,value: 10},{name: 内存,value: 16}]
}3. 嵌套文档nested
nested嵌套类型是object中的一个特例可以让对象数组类型独立索引和查询。
项目场景中弥补对象数组的一些查询问题
接着前面创建的对象数组 attrs 先添加几条数据
POST _bulk
{create:{_index:indexname,_id:20}}
{attrs:[{name:长度,value:64},{name:内存,value:32}]}
{create:{_index:indexname,_id:21}}
{attrs:[{name:长度,value:64},{name:内存,value:64}]}
{create:{_index:indexname,_id:22}}
{attrs:[{name:长度,value:64}]}现在业务需求需要 属性长度 且 值32 的数据目前数据里没有我们来写查询语法。
GET indexname/_search
{query: {bool: {must: [{term: {attrs.name: 长度}},{term: {attrs.value: 32}}]}}
}运行后发现居然有数据为什么呢我们后面原理篇会讲。 怎么解决这种问题呢使用 nested 类型即可解决。 添加映射字段
POST indexname/_mapping
{properties: {attrsNested: {type: nested,properties: {name: {type: keyword},value: {type: keyword}}}}
}添加几条数据
POST _bulk
{create:{_index:indexname,_id:20}}
{attrsNested:[{name:长度,value:64},{name:内存,value:32}]}
{create:{_index:indexname,_id:21}}
{attrsNested:[{name:长度,value:64},{name:内存,value:64}]}
{create:{_index:indexname,_id:22}}
{attrsNested:[{name:长度,value:64}]}查询数据
GET indexname/_search
{query: {nested: {path: attrsNested,query: {bool: {must: [{term: {attrsNested.name: 长度}},{term: {attrsNested.value: 32}}]}}}}
}已经查不到数据了问题完美解决
4. 子字段
text类型不能用于排序、聚合。为什么呢因为它的属性 fielddata 默认是false设置为true就可以了但是不建议使用会增加内存的压力。
添加字段映射不建议设置true
POST indexname/_mapping
{properties: {address: {type: text,fielddata:true}}
}直接使用 keyword 类型可以进行排序、聚合。
想必会有同学有疑问 同样是字符串类型干脆直接都用keyword类型不就行了。 如果你不需要 分词 那么你用keyword完全可以如果你需要对字段值分词那你还是需要用text。
那么有没有不增加压力而且不用两个字段的方法呢 当然有就是做子字段
POST indexname/_mapping
{properties: {address: {type: text,fields: {keyword: {type: keyword,ignore_above: 256}}}}
}address 字段下增加了 keyword 名字的字段类型是 keyword设置256长度
对应查询子字段keyword的语句
GET indexname/_search
{query: {term:{address.keyword: }}
}5. 地理类型
geo_point 是地理类型。移动互联网的时代移动设备越来越多要根据地理位置搜索地址可以把地址的经纬度数据设置地理数据类型。
POST indexname/_mapping
{properties: {location: {type: geo_point}}
}添加一条地理位置数据
PUT indexname/_doc/6
{location: {lat: 41.07,lon: 116.64}
}lat经度lon纬度
根据41.07116.14坐标查询100km内的位置信息
GET indexname/_search
{query: {geo_distance: {distance: 100km,location: {lat: 41.07,lon: 116.14}}}
}根据23.6,32.2位置对查询结果进行远近排序
GET indexname/_search
{query: {match_all: {}},sort: [{_geo_distance: {location: 23.6,32.2,unit: km}}]
}更多资料请看《ElasticSearch入门到实战教程》点击查看