当在es中新建一个mapping后,存储数据后,发现mapping中字段不能满足当前业务需要,要对mapping结构进行扩充字段,但是在扩充字段时会发现,es新增字段不能设置默认属性,那么这样如果用新字段进行查询时,将不会获取到历史数据,这样就会使得历史数据失效。
解决方案:
1.批量修改:将历史数据查出(批量进行修改,将扩充字段补充完整)
2.利用missing匹配
post请求
Missing Filter
缺失值查询,与Exists查询正好相反。查询expansion不存在的数据
curl -XPOST "ip:port/student/student/_search"
{
"filter": {
"missing": {
"field": "expansion" <!--扩展字段-->
}
}
}
api:
private static void testMissingQuery(String indexName, String typeName, String fieldName) {
QueryBuilder qb = QueryBuilders.missingQuery(fieldName) //设置缺少字段
.existence(true)//find missing field that doesn’t exist
.nullValue(true);//find missing field with an explicit null value //需要配合mapping的 null_value 使用,否则,没用
//设置正常匹配属性和value
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery(fieldName, "value");
BoolQueryBuilder bool = new BoolQueryBuilder();
//or关系 统计将缺该字段和该字段值为value的数据
bool.should(qb).should(termQueryBuilder);
SearchRequestBuilder searchRequestBuilder = Tool.CLIENT.prepareSearch(indexName).setTypes(typeName).setQuery(bool);
logger.info(searchRequestBuilder);
SearchResponse sResponse = searchRequestBuilder.get();
logger.info("fieldName:" + sResponse.getHits().getTotalHits());