ElasticSearch的Java API

参考文档: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 接口使用

  1. 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()));
}
  1. QueryBuilders.termsQuery(String name, Collection<?> values)
    多值判断,
if (CollectionUtils.isNotEmpty(param.getCreators())) {
     queryBuilder.filter(QueryBuilders.termsQuery("creator", param.getCreators()));
}
  1. QueryBuilders.matchQuery(String name, Object text)
    match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;例如输入“小龙虾”,match会拆分成“小”,“龙”,“虾”三个字,只要包含其中一个字的都会被查出来。

  2. QueryBuilders.matchPhraseQuery(String name, Object text)
    称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致。例如text为“小龙虾”时,只有包含“小龙虾”整个词的才会被搜出来。

if (Objects.nonNull(param.getKeyWord())) {
	queryBuilder.filter(QueryBuilders.matchPhraseQuery("key_word", param.getKeyWord()));
}
  1. 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来做,如下:
在这里插入图片描述

注:

  1. term不会分词,keyword字段也不会分词;
  2. match分词,text也会分词;
  3. match_phrase的分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的;
  4. query_string查询keyword类型的字段,无法查询,查text类型的字段和match_phrase的区别是不需要连续,顺序还可以调换。
    参考链接:ES查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值