一. source和store属性
- ElasticSearch是以json格式存储原始文件数据的,这个原始文件包括所有字段field的数据,_source字段表明是否存储这个原始文件数据。
- 如果一个字段的mapping中含有store属性为true,那么有一个单独的存储空间为这个字段做存储,而且这个存储是独立于_source的存储的。
- 这个单独的存储空间不是指分词之后存储倒排索引所在的空间,因为我们把某个字段field映射为{“type”: “text”, “store”: true},字段值为"江西省"。通过term查找"江西省"不能匹配,term查找"江", “西”, "省"确能匹配
1.1 设置_source
_source字段默认"enabled":true,下面例子禁止存储所有的field字段
{
"yourtype":{
"_source":{
"enabled":false
},
"properties": {
...
}
}
}
只存储address和baseAddress字段
{
"yourtype":{
"_source":{
"includes":["address", "baseAddress"]
},
"properties": {
...
}
}
}
排除不存储address和baseAddress字段
{
"yourtype":{
"_source":{
"excludes":["address", "baseAddress"]
},
"properties": {
...
}
}
}
1.2 查询过滤_source字段
查询时通过source filtering的方法过滤返回的字段,这个会从json原始文档返回其中的address和baseAddress字段
{
"_source": ["address", "baseAddress"]
}
1.3 设置store
store字段默认是false不存储的,下面的例子设置存储address字段。
{
"household-address": {
"properties": {
"address": {
"type": "keyword",
"store": true
},
"baseAddress": {
"type": "keyword",
"store": false
}
}
}
}
1.4 查询过滤store字段
查询时通过stored_fields的方法过滤返回的字段,这个会从存储的field文档返回其中的address和baseAddress字段
{
"stored_fields": [ "address", "baseAddress" ]
}
1.5 两者优点和缺点
- 使用store存储字段field会占用磁盘空间。如果需要从文档中提取(即在脚本中和聚合)它会帮助减少计算。在聚合时具有store属性的字段会比不具有这个属性的字段快。
- 从每一个stored field中获取值都需要一次磁盘io,如果想获取多个field的值就需要多次磁盘io。但从_source中获取多个field的值则只需要一次磁盘io因为_source只是一个字段而已,而且_source是被压缩过的。所以在大多数情况下,从_source中获取是快速而高效的。
- 从_source中获取值是快速而且高效的。但如果你的文档长度很长,存储 _source或者从_source中获取field的代价很大,你可以显式的将某些field的store属性设置为yes。
二. all和copy_to属性
- 在6.0+中_all字段默认被禁用,同时在创建index的时候不能enable;建议使用copy_to 实现用户自定义的_all 功能。
- copy_to可以把该字段的值拷贝到一个新的字段当中去。
- 如果要复制到的目标字段(下例中的address字段)类型是text,则不管源字段(下例中的baseAddress字段)是什么类型,建立倒排索引都会进行分词。
- 如果要复制到的目标字段(下例中的address字段)类型是keyword,则不管源字段(下例中的baseAddress字段)是什么类型,建立倒排索引都不会分词且分别对各个字段原始值建立索引。
如下例:“address”: “广东省”,“baseAddress”: “抚州市”,“detailAddress”: “广昌县”。则对address建立了三个索引[“广东省”, “抚州市”, “广昌县”],而不会建立"广东省抚州市广昌县"索引。
2.1 设置copy_to
PUT /network-loan-apply-household-address/_mapping/household-address
{
"household-address": {
"properties": {
"address": {
"type": "keyword",
"ignore_above": 256,
"index" : true,
"store": false
},
"baseAddress": {
"type": "text",
"index" : true,
"store": false,
"copy_to": "address"
},
"detailAddress": {
"type": "text",
"index" : true,
"store": false,
"copy_to": "address"
}
}
}
}
三. index索引属性
- 控制某个字段是否生成倒排索引;
- Elasticsearch 5之前,index属性的取值有三个:analyzed-字段被索引,会做分词,可搜索。
not_analyzed-字段值不分词,会被原样写入索引,可搜索。no-字段不写入索引,也就不能搜索 - 在Elasticsearch 5之后index属性的取值有两个:true-字段被索引,可搜索;false-字段不被索引,不可被搜索。至于会不会做分词则通过字符串是text还是keyword来区分。
3.1 text和keyword
- 在es 2.*版本里面是没有这两个字段只有string字段;5.*之后取消了string,引入text,keyword字段
- text做倒排索引时会分词,支持全文检索,支持模糊、精确查询,不支持聚合,排序操作;
- text类型的最大支持的字符长度无限制(对于text字段不支持ignore_above),适合大字段存储;
- keyword做倒排索引时不进行分词,支持模糊、精确匹配,支持聚合、排序操作。
- keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
- 只有keyword类型支持ignore_above,超过这个长度的字段不会建立倒排索引,所以也不能被搜索
3.2 设置type和index
PUT /network-loan-apply-household-address/_mapping/household-address
{
"household-address": {
"properties": {
"address": {
"type": "keyword",
"ignore_above": 256,
"index" : true,
"store": false
}
}
}
}