不为失败找理由,要为成功找方法。

es里面有什么办法可以根据当前条件获取所有字段名吗(数据量较大的情况)

Elasticsearch | 作者 Inchapter | 发布于2018年01月31日 | 阅读数:8163

想要根据当前的搜索条件,查询返回该条件下的存在的字段,
尝试过对所有字段进行exists搜索来判断是否存在,但是数据量大的时候查询时间较长。
有没有类似于对类型分桶,查询所有字段的方法?如下
{
"aggs": {
"type": {
"terms": {
"field": "_type"
},
"aggs": {
"field_list": {}
}
}
}
}
补充一下场景:

比如索引myindex里有两条数据,类型是test
{"a":1, "b":2} 和 {"a":2, "c":3}
那么myindex的mapping结构是包括3个字段的,如下
{"mappings": {
"test": {
"properties": {
"a": {
"type": "long"
},
"b": {
"type": "long"
},
"c": {
"type": "long"
}
}
}
}
}
如果这个时候我们改变搜索条件,a=1,我希望能够返回字段名是a和b,如果a=2,希望能够返回a和c字段
 
 

 
已邀请:

huigy

赞同来自:

首先aggs更耗时,其次你可以用size取第一条。最后你可以用cat index获取表信息

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

你直接检索一条数据,返回结果,解析json不可以吗

Inchapter

赞同来自:

最近看到2.x版本的elasticsearch中有个_field_names,可以根据这个字段聚合得到当前条件下的所有非空字段。但是在5.x之后的版本这个方法被移除了,原因大概是占用了大量的存储空间。
 
所以如果要实现这个功能,也可以类似这种方式,在每个文档中新增一个字段,这个字段存储当前文档所有非空字段的名称,之后只需要对这个字段聚合即可满足这个功能。
 
缺点是增加了额外的存储空间

要回复问题请先登录注册