ElasticSearch Java查詢某字段既不爲null也不爲空的條目

  最近需要查詢某個字段既不爲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碼進行範圍查詢,速度沒有問題,至於高併發情況下也沒有測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章