Elasticsearch - 字段的index和store属性使用详解(附:指定索引、存储字段样例)
作者:hangge | 2025-05-19 08:42
1,基本介绍
(1)我们在向 Elasticsearch 中添加数据的时候,ES 底层针对每个字段其实还会涉及到 index 和 store 这两个属性:
- 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。
- 由于需要根据 name、address 这两个字段继续查询,因此这两个字段需要建立索引,另外两个字段不需要建立索引。
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
}
}
}
}'
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 可以查询到数据,说明 address 的 index 属性生效了。
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)