参考文档:es中的term和match的区别 ,QueryBuilder学习
BoolQueryBuilder接口使用
查询的时候一般使用BoolQueryBuilder的filter方法,效率更高,因为filter不会进行打分评估(计算_score的值),而must方法会计算,should也会。
1,must、mustNot、should、filter的区别
//定义一个BoolQueryBuilder对象
BoolQueryBuilder qb = QueryBuilders.boolQuery();
//1,返回的文档必须满足must子句的条件,并且参与计算分值
qb.must(QueryBuilder queryBuilder);
//2,返回的文档必须不满足定义的条件
qb.mustNot(QueryBuilder queryBuilder)
//3,返回的文档可能满足should子句的条件;在一个bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回
qb.should(QueryBuilder queryBuilder));
//4,返回的文档必须满足filter子句的条件,但是不会像must一样,参与计算分值
qb.filter(QueryBuilder queryBuilder));
QueryBuilder 接口使用
- QueryBuilders.termQuery(String name, Object value)
等值搜索,相当于sql语句中的“=”,term query 属于过滤器查询,可以处理数字(numbers),布尔值(boolean),日期以及文本(text)。term属于精确匹配,而且只能查单个词(一个汉字或者一个英文单词),不会对用户输入的内容进行分词
if (Objects.nonNull(param.getOrgId())) {
queryBuilder.filter(QueryBuilders.termQuery("org_ids", param.getOrgId()));
}
- QueryBuilders.termsQuery(String name, Collection<?> values)
多值判断,
if (CollectionUtils.isNotEmpty(param.getCreators())) {
queryBuilder.filter(QueryBuilders.termsQuery("creator", param.getCreators()));
}
-
QueryBuilders.matchQuery(String name, Object text)
match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;例如输入“小龙虾”,match会拆分成“小”,“龙”,“虾”三个字,只要包含其中一个字的都会被查出来。 -
QueryBuilders.matchPhraseQuery(String name, Object text)
称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致。例如text为“小龙虾”时,只有包含“小龙虾”整个词的才会被搜出来。
if (Objects.nonNull(param.getKeyWord())) {
queryBuilder.filter(QueryBuilders.matchPhraseQuery("key_word", param.getKeyWord()));
}
- QueryBuilders.rangeQuery(String name).from(Object from).to(Object to)
范围搜索,rangeQuery可以处理数字,日期以及字符串等。
# 闭区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}).to(${fieldValue2});
# 开区间查询
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").from(${fieldValue1}, false).to(${fieldValue2}, false);
# 大于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gt(${fieldValue});
#大于等于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").gte(${fieldValue});
# 小于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lt(${fieldValue});
# 小于等于
QueryBuilder qb1 = QueryBuilders.rangeQuery("${fieldName}").lte(${fieldValue});
注:terms里的多个参数是或者的关系,只要满足其中一个词就可以,想要同时满足多个词的话,就得使用bool的must来做,如下:
注:
- term不会分词,keyword字段也不会分词;
- match分词,text也会分词;
- match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的;
- query_string查询keyword类型的字段,无法查询,查text类型的字段和match_phrase的区别是不需要连续,顺序还可以调换。
参考链接:ES查询