代码如下:
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery(field); //查询字段不存在及字段值为空 filterBuilder = QueryBuilders.boolQuery().should(new BoolQueryBuilder().mustNot(existsQueryBuilder)) .should(QueryBuilders.termsQuery(field, ""));
客户端查询:
查询结果:
只能查找出该”字段不存在”的数据,而字段值为“空字符串”的匹配不到结果;
分析:
网上说field字段为text类型时,会默认进行分词,对于“空字符串”,索引时默认不进行倒排索引,因此查不到结果,
将字段修改成keyword类型可以解决问题,但是如果需要用text类型,有什么好的方案吗?
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery(field); //查询字段不存在及字段值为空 filterBuilder = QueryBuilders.boolQuery().should(new BoolQueryBuilder().mustNot(existsQueryBuilder)) .should(QueryBuilders.termsQuery(field, ""));
客户端查询:
查询结果:
只能查找出该”字段不存在”的数据,而字段值为“空字符串”的匹配不到结果;
分析:
网上说field字段为text类型时,会默认进行分词,对于“空字符串”,索引时默认不进行倒排索引,因此查不到结果,
将字段修改成keyword类型可以解决问题,但是如果需要用text类型,有什么好的方案吗?
2 个回复
medcl - 今晚打老虎。
赞同来自: laoyang360 、wokeyi 、Cheetah 、cccthought
https://www.elastic.co/guide/e ... .html
wokeyi
赞同来自: