elasticsearch head 复合查询_Elasticsearch之复合查询--- booting查询的使用案例

该查询用于将两个查询封装在一起,并降低其中一个查询所返回文档的分值。

它接受一个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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值