为了优化索引性能,需要统计索引的字段数量。
Elasticsearch默认索引字段不能超过1000,由index.mapping.total_fields.limit
参数进行设置。字段和对象映射,以及字段别名都计入这个限制。该值越大会导致内存不足和性能下降,特别在高负载的集群环境。
实际应用mapping定义通常采用动态模板进行定义,那么如何统计索引中字段数量,以及如何解决字段数超过限制问题。
统计索引中字段数量
ES没有提供_stat
统计字段API,下面介绍字段能力API,可以返回多个索引的字段信息:
GET /_field_caps?fields=<fields>
POST /_field_caps?fields=<fields>
GET /<target>/_field_caps?fields=<fields>
POST /<target>/_field_caps?fields=<fields>
下面示例查看字段rating
和title
信息:
GET _field_caps?fields=rating,title
响应:
{
"indices": [ "index1", "index2", "index3", "index4", "index5" ],
"fields": {
"rating": {
"long": {
"searchable": true,
"aggregatable": false,
"indices": [ "index1", "index2" ],
"non_aggregatable_indices": [ "index1" ]
},
"keyword": {
"searchable": false,
"aggregatable": true,
"indices": [ "index3", "index4" ],
"non_searchable_indices": [ "index4" ]
}
},
"title": {
"text": {
"searchable": true,
"aggregatable": false
}
}
}
}
共5个索引,返回每个字段所属那些索引及其类型。如title在所有索引中都存在。
查询某个索引的字段信息,同时包括未映射的字段:
GET /index_name/_field_caps?fields=*&include_unmapped
超过字段数量限制
自然的想法是能不能调大index.mapping.total_fields.limit
参数,如果要调大,最好同时调整indices.query.bool.max_clause_count
参数,即查找中布尔查询子句的最大数量。
- 使用flattened数据类型
对于对象中的子字段默认被单独映射、索引。扁平字段类型是解决字段过多问题的另一种方法,它把整个对象映射未单个字段。给定对象,flattened 类型解析出每个子字段值作为keyword类型,对象中的内容可以通过单个查询进行搜索或聚集。对于唯一字段类型未知的情况非常有用,对于真个json对象仅创建一个映射字段,可以有效防止映射有太多的字段————映射爆炸。
另外扁平对象字段在搜索功能方面提供了一种折衷方案。只允许基本查询,不支持数字范围查询或高亮显示。
示例:
PUT bug_reports
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"labels": {
"type": "flattened"
}
}
}
}
POST bug_reports/_doc/1
{
"title": "Results are not sorted correctly.",
"labels": {
"priority": "urgent",
"release": ["v1.2.5", "v1.3.0"],
"timestamp": {
"created": 1541458026,
"closed": 1541457010
}
}
}
POST bug_reports/_doc/2
{
"title": "Results are not descripted correctly.",
"labels": {
"priority": "urgent",
"release": ["v1.3.5", "v1.4.0"],
"creator": "tester",
"timestamp": {
"created": 1541458026,
"closed": 1541457010
}
}
}
这里定义了flattened类型labels字段,实际插入数据未对象,可以包括多个属性。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/114290844