要不要也来分享分享一下啊

es中字段如何匹配空字符串

Elasticsearch | 作者 wokeyi | 发布于2017年10月10日 | 阅读数:14760

  代码如下:
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery(field); //查询字段不存在及字段值为空 filterBuilder = QueryBuilders.boolQuery().should(new BoolQueryBuilder().mustNot(existsQueryBuilder)) .should(QueryBuilders.termsQuery(field, ""));
客户端查询:

SSS.png


查询结果:
只能查找出该”字段不存在”的数据,而字段值为“空字符串”的匹配不到结果;

分析:
网上说field字段为text类型时,会默认进行分词,对于“空字符串”,索引时默认不进行倒排索引,因此查不到结果,
将字段修改成keyword类型可以解决问题,但是如果需要用text类型,有什么好的方案吗?
 
已邀请:

medcl - 今晚打老虎。

赞同来自: laoyang360 wokeyi Cheetah cccthought

在mapping 里面给该字段设置一个 null_value 属性
https://www.elastic.co/guide/e ... .html

wokeyi

赞同来自:

最后在“customerTag”字段上加一个子字段:
"customerTag":{
"type":"text",
"analyzer":"strict_analyzer",
"fields": {
"key": {
"type":"keyword"
}
}
}
过滤时,使用key进行term过滤
filterBuilder = QueryBuilders.boolQuery().should(new BoolQueryBuilder().mustNot(existsQueryBuilder))
.should(QueryBuilders.termsQuery(field.equals("customerTag") ? "customerTag.key" : field, ""));

要回复问题请先登录注册