Elasticsearch新增查询字段后查询兼容方案

当在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());

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值