最近需要查詢某個字段既不爲null也不爲"",但網上有很多關於ES查詢某些字段爲null和""的博文,研究了一下,發現有三種方案。
方案一: 使用existsQuery關鍵字,查詢出某些字段存在(值爲null)的條目,但是不能過濾出值爲""的字段
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.boolQuery().must((QueryBuilders.existsQuery("字段名稱"))));
方案二:使用wildcardQuery關鍵字
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
//星號表示所有,即:不爲空的字段
must.add(QueryBuilders.wildcardQuery("字段名稱", "*"));
方案三:使用ASCII碼比較,首先,null的ASCII是0,空格的ASCII是32,空字符的ASCII好像也是0(此處有些疑問
),此時我們可以用範圍比較。
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
RangeQueryBuilder range = QueryBuilders.rangeQuery("字段名稱");
//ASCII碼大於0(此處爲0時,字段值爲""的條目不會顯示,因此有""的ASCII值也是0的判斷)
range.gt(0);
must.add(range);
補充:
1. 方案一是最好的方案。ES中,某個字段的值爲null,它不會顯示出來;若爲"",則會顯示出來。問題就在這兒,方案一雖好,但是不合乎要求,所以往ES中添加數據時,一定不要寫入空字符串
,因爲這無疑時給自己找麻煩。
2. 方案二是模糊查詢,據說
效率最低,查詢最耗資源。我目前用的就是這個,因爲我在將近5000萬數據中查詢毫無問題,返回速度也就50多毫秒(做了翻頁),不知道在高併發情況下會如何,以後要是出了問題在和大家報備。
3. 方案三是利用ASCII碼進行範圍查詢,速度沒有問題,至於高併發情況下也沒有測試。