赞
踩
先来熟QueryBuilders这个类封装的基本查询
通常都是将多个查询条件组合在一起,常用的有must、must_not、should
{"address":"鸿星尔克0","codes":"中国人民银行0","id":0,"name":"平安富士康0"}
{"address":"鸿星尔克1","codes":"中国人民银行1","id":1,"name":"平安富士康1"}
{"address":"鸿星尔克2","codes":"中国人民银行2","id":2,"name":"平安富士康2"}
{"address":"鸿星尔克3","codes":"中国人民银行3","id":3,"name":"平安富士康3"}
{"address":"鸿星尔克4","codes":"中国人民银行4","id":4,"name":"平安富士康4"}
{"address":"汽车家族0","id":0,"name":"快递收货0"}
{"address":"汽车家族1","id":1,"name":"快递收货1"}
{"address":"汽车家族2","id":2,"name":"快递收货2"}
{"address":"汽车家族3","id":3,"name":"快递收货3"}
{"address":"汽车家族4","id":4,"name":"快递收货4"}
{"address":"新鲜水果-徐鲸鱼0","id":0,"name":"东方不败0"}
{"address":"新鲜水果-徐鲸鱼1","id":1,"name":"东方不败1"}
{"address":"新鲜水果-徐鲸鱼2","id":2,"name":"东方不败2"}
{"address":"新鲜水果-徐鲸鱼3","id":3,"name":"东方不败3"}
{"address":"新鲜水果-徐鲸鱼4","id":4,"name":"东方不败4"}
@Test public void testBoolQuery() throws IOException { SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR)); boolQuery.mustNot(QueryBuilders.termsQuery("id","0","2")); searchSourceBuilder.query(boolQuery); searchRequest.source(searchSourceBuilder); SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS); for (SearchHit documentFields : search.getHits().getHits()) { System.out.println(documentFields.getScore() + ":::" +documentFields.getSourceAsString()); } }
查看日志打印
为什么address中包含汽车的得分高于包含水果的,因为包含汽车的address字段的值有5个字符,包含水果的address字段值包含9个字符,字符越少的,得分越高。
之前在must条件中是这么写的
后来发现一直查不到数据,发现这样写不对,我们查询需求是:address必须包含‘汽车’或者‘水果的’,但如果这样写的话就成了address中既要匹配‘水果’又要匹配,显然没有哪个address字段值既包含水果又包含汽车的,所以查询不到。
@Test public void testBoolQuery() throws IOException { SearchRequest searchRequest = new SearchRequest(indexName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR)); boolQuery.mustNot(QueryBuilders.termsQuery("id","0","2")); boolQuery.should(QueryBuilders.matchQuery("name","东方")); searchSourceBuilder.query(boolQuery); searchRequest.source(searchSourceBuilder); SearchResponse search = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS); for (SearchHit documentFields : search.getHits().getHits()) { System.out.println(documentFields.getScore() + ":::" +documentFields.getSourceAsString()); } }
查看日志
此时,在should中指定的条件name中包含东方的,分数就提高了。
如果我们将must条件修改为一下,则还是会查询不到数据,因为没有一条文档的address包含‘汽车’或‘水果’同时codes包含‘中国’
boolQuery.must(QueryBuilders.matchQuery("address","水果 汽车").operator(Operator.OR));
在复合查询时,我们使用must构建了 address必须包含‘汽车’或‘水果’的查询条件,但我们也可以给这个must再嵌套一个布尔查询,这个bool查询应该是一个should关系,如下
private BoolQueryBuilder buildBoolQuery(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("address","水果"));
boolQueryBuilder.should(QueryBuilders.matchQuery("address","汽车"));
return boolQueryBuilder;
}
修改must构造即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。