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的意思