返回 导航

大数据

hangge.com

Elasticsearch - 字段的index和store属性使用详解(附:指定索引、存储字段样例)

作者:hangge | 2025-05-19 08:42

1,基本介绍

(1)我们在向 Elasticsearch 中添加数据的时候,ES 底层针对每个字段其实还会涉及到 indexstore 这两个属性:
  • index:表示是否在 ES 中建立索引,默认为 true
  • store:表示是否在 ES 中存储,默认为 false

(2)这里的 store 属性其实是 Lucene 中的语法,表示是否存储字段内容,ES 对它做了优化,默认会使用 _source 字段存储原始文档所有字段的内容,这样可以提高数据解析性能,所以这里的 store 属性其实就不需要设置了,它的默认值就是 false,表示不存储。
注意:如果这里的 store 也设置为 true,此时 ES 会重复存储对应字段的内容。

2,需求说明

(1)假设我要向 ES 中添加一批学生数据,包括姓名、年龄、性别、家庭住址这些字段。
(2)针对这批数据,我的需求是需要根据学生的姓名、家庭住址进行查询,最终在返回结果数据的时候,只需要把学生的姓名、年龄、性别返回过来即可,不需要返回家庭住址。

3,实现原理

(1)一个字段是需要建立索引、或者是否需要存储依据如下规则:
  • 判断一个字段是否需要建立索引,唯一的依据就是是否需要根据这个字段进行查询,如果需要,则建立索引,否则不建立索引。
  • 判断一个字段是否需要存储,唯一的依据就是是否需要从 ES 中获取这个字段的值,如果需要,则存储,否则不存储。
注意:在实际工作中,针对某个字段来说,需要建立索引,但是不需要存储,这种场景也是存在的,因为某一些字段内容如果比较大,并且没有必要从 ES 中返回,其实就没必要在 ES 中存储了,否则会额外占用 ES 的存储空间,也会影响 ES 的查询效率。

(2)针对上面这个需求而言:
  • 需要根据学生的姓名、家庭住址进行查询,所以这两个字段必须在 ES 中建立索引,否则无法根据姓名和家庭住址进行查询。
  • 还需要在返回结果数据的时候把学生的姓名、年龄、性别返回过来,那也就意味着姓名、年龄、性别字段需要在 ES 中进行存储,否则 ES 是无法返回这些字段内容的。

4,实现步骤

(1)针对这个案例,我们执行如下命令创建一个索引库 stuinfo
  • 由于默认情况下 _source 字段会存储所有字段的内容,我们需要在 _source 字段中过滤掉不需要存储的字段 address
  • 由于需要根据 nameaddress 这两个字段继续查询,因此这两个字段需要建立索引,另外两个字段不需要建立索引。
curl -H "Content-Type: application/json" \
     -XPUT "http://192.168.121.128:9200/stuinfo" \
     -d '{
         "mappings": {
             "_source": {
                 "excludes": ["address"]
             },
             "properties": {
                 "name": {
                     "type": "text",
                     "index": true
                 },
                 "age": {
                     "type": "integer",
                     "index": false
                 },
                 "sex": {
                     "type": "text",
                     "index": false
                 },
                 "address": {
                     "type": "text",
                     "index": true
                 }
             }
         }
     }'

(2)然后查询这个索引库的 mappings 信息。
curl -XGET 'http://192.168.121.128:9200/stuinfo/_mapping?pretty'

(3)接着,我们向索引库中添加一条数据:
curl -H "Content-Type: application/json" \
     -XPOST "http://192.168.121.128:9200/stuinfo/_doc/1" \
     -d '{
         "name": "hangge",
         "age": 20,
         "sex": "man",
         "address": "bj"
     }'

(4)然后查看这条数据,验证一下效果。发现返回的 _source 字段中确实没有 address 字段的内容了。
curl -XGET 'http://192.168.121.128:9200/stuinfo/_search?pretty' 

(5)最后,我们进行 query 查询。根据 address 可以查询到数据,说明 addressindex 属性生效了。
curl -H "Content-Type: application/json" \
     -XGET "http://192.168.121.128:9200/stuinfo/_search?pretty" \
     -d '{
         "query": {
             "match": {
                 "address": "bj"
             }
         }
     }'

(6)而如果我们使用 sex 字段进行查询,会看到报错信息,因为 sex 字段没有建立索引是无法作为查询字段的。
curl -H "Content-Type: application/json" \
     -XGET "http://192.168.121.128:9200/stuinfo/_search?pretty" \
     -d '{
         "query": {
             "match": {
                 "sex": "man"
             }
         }
     }'
评论

全部评论(0)

回到顶部