ElasticSearch搜尋欄位不需要計入得分

Pojor發表於2020-12-10

ElasticSearch的索引同步對物理刪除的資料需要做一些對應的操作才能同步,一般都是採用狀態判斷是否刪除,所以資料同步到es索引中,我麼在查詢時需要對資料的狀態進行判斷,同時這個條件我們不希望他會影響最終查詢記錄的得分,這個時候就需要用到ConstantScoreQueryBuilder構造器了。
這裡寫的全是後臺的查詢的程式碼。如果說想看具體的es查詢語句,可以在後臺列印出來對應的查詢語句。
在使用ConstantScoreQueryBuilder時,我們肯定會有其他的查詢條件,所以還會用到BoolQueryBuilder這個構造器,這是個複雜查詢構造器,可以有多個查詢條件,可以通過and或者or進行連線。

// searchSourceBuilder將查詢轉換為es的查詢語句
 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 // 使用BoolQueryBuilder物件(複雜查詢)
 BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyWord, 		  "title", "description")
                    .type(MultiMatchQueryBuilder
                            .Type.BEST_FIELDS);
            // 精準匹配(不分詞)
            TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("delete_flag", 0);
            // 使用constantScoreQuery查詢不計入得分
            ConstantScoreQueryBuilder constantScoreQueryBuilder = QueryBuilders.constantScoreQuery(termQueryBuilder);
            boolQueryBuilder.must(multiMatchQueryBuilder)
                    .must(constantScoreQueryBuilder);
            searchSourceBuilder.query(boolQueryBuilder);
            searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

將兩個查詢條件裝入boolQueryBuilder之後,在交給searchSourceBuilder 進行轉換為es查詢語句。這樣就完成啦。
看下效果

	"query": {
		"bool": {
			"must": [{
				"multi_match": {
					"query": "測試",
					"fields": ["description^1.0", "title^1.0"],
					"type": "best_fields",
					"operator": "OR",
					"slop": 0,
					"prefix_length": 0,
					"max_expansions": 50,
					"zero_terms_query": "NONE",
					"auto_generate_synonyms_phrase_query": true,
					"fuzzy_transpositions": true,
					"boost": 1.0
				}
			}, {
				"constant_score": {
					"filter": {
						"term": {
							"delete_flag": {
								"value": 0,
								"boost": 1.0
							}
						}
					},
					"boost": 1.0
				}
			}],
			"adjust_pure_negative": true,
			"boost": 1.0
		}
	},

must的相當於and的意思

相關文章