该查询用于将两个查询封装在一起,并降低其中一个查询所返回文档的分值。
它接受一个positive查询和一个negative查询。只有匹配了positive查询的文档才会被包含到结果集中,但是同时匹配了negative查询的文档会被降低其相关度,通过将文档原本的score和negative_boost参数进行相乘来得到新的score。因此,negative_boost参数必须小于1.0。在上面的例子中,任何包含了指定负面词条的文档的score都会是其原本score的一半。
例如:
在互联网上搜索"苹果"也许会返回,水果或者各种食谱的结果。我们可以通过排除“水果 乔木 维生素”和这类单词,结合bool查询中的must_not子句,将结果范围缩小到只剩苹果手机。
查询JSON如下:
{"query": {"boosting": {"positive": {"match": {"smsContent": {"query": "苹果","operator": "OR","prefix_length": 0,"max_expansions": 50,"fuzzy_transpositions": true,"lenient": false,"zero_terms_query": "NONE","auto_generate_synonyms_phrase_query": true,"boost": 1.0}}},"negative": {"match": {"smsContent": {"query": "水果 乔木 维生素","operator": "OR","prefix_length": 0,"max_expansions": 50,"fuzzy_transpositions": true,"lenient": false,"zero_terms_query": "NONE","auto_generate_synonyms_phrase_query": true,"boost": 1.0}}},"negative_boost": 0.1,"boost": 1.0}}}
java High Level REST Client:
public void boostingQuery(String indexName, String typeName) throws IOException { SearchRequest searchRequest = new SearchRequest(indexName); searchRequest.types(typeName); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); MatchQueryBuilder matchQueryPositiveBuilder = QueryBuilders.matchQuery("smsContent", "苹果"); MatchQueryBuilder matchQueryNegativeBuilder = QueryBuilders.matchQuery("smsContent", "水果 乔木 维生素");// BoostingQueryBuilder boostingQueryBuilder = QueryBuilders.boostingQuery(matchQueryPositiveBuilder, matchQueryNegativeBuilder).negativeBoost(0.1f); searchSourceBuilder.query(boostingQueryBuilder); searchRequest.source(searchSourceBuilder); log.info("source:" + searchRequest.source()); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = searchResponse.getHits(); System.out.println(searchRequest.source().toString()); System.out.println("count:"+hits.totalHits); SearchHit[] h = hits.getHits(); for (SearchHit hit : h) { System.out.println("score:"+hit.getScore()); System.out.println("结果"+hit.getSourceAsMap()); }}
演示用例:
/** * 它接受一个positive查询和一个negative查询。只有匹配了positive查询的文档才会被包含到结果集中, * 但是同时匹配了negative查询的文档会被降低其相关度,通过将文档原本的_score和negative_boost参数进行相乘来得到新的_score。 * 因此,negative_boost参数必须小于1.0。在上面的例子中,任何包含了指定负面词条的文档的_score都会是其原本_score的一半。 * @throws IOException */@Testpublic void testBoostingQuery() throws InterruptedException, IOException { SmsSendLog smsSendLog = new SmsSendLog(); smsSendLog.setMobile("13800000000"); smsSendLog.setCorpName("天猫商城"); smsSendLog.setCreateDate(new Date()); smsSendLog.setSendDate(new Date()); smsSendLog.setIpAddr("10.126.2.9"); smsSendLog.setLongCode("10690000988"); smsSendLog.setReplyTotal(10); smsSendLog.setSmsContent("【天猫商城】苹果手机双11大优惠,原价8000块钱的苹果土豪金IPNONE手机,惊爆降价2000元,速来抢购。你也可以拥有苹果"); smsSendLog.setProvince("北京"); smsSendLog.setOperatorId(1); docService.add(indexName,type, JSON.toJSONString(smsSendLog),"17"); smsSendLog.setMobile("13700000001"); smsSendLog.setProvince("上海"); smsSendLog.setSmsContent("苹果,是水果中的一种,是蔷薇科亚科属植物,其树木为落叶乔木。营养价值很高,富含矿物质和维生素," + "含钙量丰富,有助于代谢掉体内多余盐分,酸可代谢热量,防止下半身肥胖。是人们经常食用的水果之一。"); docService.add(indexName,type, JSON.toJSONString(smsSendLog),"18"); Thread.sleep(3000l); //都可以查出来,只是SCORE值减少,可以通过SCORE值来去掉排名在后面的 boolQuery.boostingQuery(indexName,type);}
搜索结果如下,观察两个score值,苹果手机的score值明显大于水果的苹果,如下图所示:
![03b48d513a48794b28961db83f8b015f.png](https://i-blog.csdnimg.cn/blog_migrate/57c0c299600c982889c42844268585bb.jpeg)