ElasticSearch中的index、store、_source、_all属性

一. source和store属性

  1. ElasticSearch是以json格式存储原始文件数据的,这个原始文件包括所有字段field的数据,_source字段表明是否存储这个原始文件数据。
  2. 如果一个字段的mapping中含有store属性为true,那么有一个单独的存储空间为这个字段做存储,而且这个存储是独立于_source的存储的。
  3. 这个单独的存储空间不是指分词之后存储倒排索引所在的空间,因为我们把某个字段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 两者优点和缺点

  1. 使用store存储字段field会占用磁盘空间。如果需要从文档中提取(即在脚本中和聚合)它会帮助减少计算。在聚合时具有store属性的字段会比不具有这个属性的字段快。
  2. 从每一个stored field中获取值都需要一次磁盘io,如果想获取多个field的值就需要多次磁盘io。但从_source中获取多个field的值则只需要一次磁盘io因为_source只是一个字段而已,而且_source是被压缩过的。所以在大多数情况下,从_source中获取是快速而高效的。
  3. 从_source中获取值是快速而且高效的。但如果你的文档长度很长,存储 _source或者从_source中获取field的代价很大,你可以显式的将某些field的store属性设置为yes。

二. all和copy_to属性

  1. 在6.0+中_all字段默认被禁用,同时在创建index的时候不能enable;建议使用copy_to 实现用户自定义的_all 功能。
  2. copy_to可以把该字段的值拷贝到一个新的字段当中去。
  3. 如果要复制到的目标字段(下例中的address字段)类型是text,则不管源字段(下例中的baseAddress字段)是什么类型,建立倒排索引都会进行分词。
  4. 如果要复制到的目标字段(下例中的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索引属性

  1. 控制某个字段是否生成倒排索引;
  2. Elasticsearch 5之前,index属性的取值有三个:analyzed-字段被索引,会做分词,可搜索。
    not_analyzed-字段值不分词,会被原样写入索引,可搜索。no-字段不写入索引,也就不能搜索
  3. 在Elasticsearch 5之后index属性的取值有两个:true-字段被索引,可搜索;false-字段不被索引,不可被搜索。至于会不会做分词则通过字符串是text还是keyword来区分。

3.1 text和keyword

  1. 在es 2.*版本里面是没有这两个字段只有string字段;5.*之后取消了string,引入text,keyword字段
  2. text做倒排索引时会分词,支持全文检索,支持模糊、精确查询,不支持聚合,排序操作;
  3. text类型的最大支持的字符长度无限制(对于text字段不支持ignore_above),适合大字段存储;
  4. keyword做倒排索引时不进行分词,支持模糊、精确匹配,支持聚合、排序操作。
  5. keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
  6. 只有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
            }
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值