`

Elasticsearch Compound Query 复合查询详解

阅读更多
Compound Query 复合查询详解

1、 constant Query

该查询能够包含一个查询或过滤器,通过该方式将返回的文档的score设置为1, 然后通过设置boost来提高当前查询的权重(官方文档说返回的score和boost相等), 提高该查询的相关度

QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "酒")).boost(2f))
            .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "店")).boost(1f))


应用场景: 比如匹配酒店设备:多个term 泳池,花园,wifi 比如我们要将泳池的的分值放大,则将泳池的term通过该方式包一下,并设置一个你认为合理的权重,提高泳池在酒店匹配过程的占比。
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "泳池")).boost(2f))
            .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "花园")).boost(1f))
            .should(QueryBuilders.constantScoreQuery(QueryBuilders.termQuery("hotelName", "wifi")).boost(1f))


2、bool query
一种复合查询,三种逻辑关系如下 must: AND
must_not:NOT should:OR 复合查询: cityCode="chongqing_city" 并且 hotelName="hotel22"

QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("cityCode","chongqing_city")).must(QueryBuilders.matchQuery("hotelName", "hotel22"))

3、 Dis Max Query

将子查询union 到一起,没个文档的分数是 子查询中相同文档的得分最大值。 例: 北京大饭店 酒索引得分 0; 店 得分 1; 大得分1.1 最后的结果是 北京大饭店相关度得分1.1

QueryBuilders.disMaxQuery()
    .add(QueryBuilders.termQuery("hotelName","酒"))
    .add(QueryBuilders.termQuery("hotelName","店"))
    .add(QueryBuilders.termQuery("hotelName","大"));

4、boosting query

一种复合查询,分为positive子查询和negitive子查询,两者的查询结构都会返回。 positive子查询的score保持不变,negetive子查询的值将会根据negative_boost(小于1)的值相乘,做相应程度的降低分值 hotelName 检索酒店,hotelNo 检索123 hotelNo检索获得的分值通过乘以0.3来降低分值,降低相关度

QueryBuilders.boostingQuery().positive(QueryBuilders.matchQuery("hotelName", "酒店")).negative(QueryBuilders.matchQuery("hotelNo","123")).negativeBoost(0.3f)


5、 indices Query

跨索引复合查询,实现跨索引的查询,并提供没有查询到结果是 从其他索引查询(默认是从其他所有索引进行匹配) 如下实例:从 索引1,索引2 中查询hotelName = "7天"的 term 查询。 如果没有查询到数据,从 索引3 查询hotelName = "置" 的term查询,如果没有指明索引3,默认从client下所有索引中进行匹配结果

QueryBuilder queryBuilder = QueryBuilders.indicesQuery(QueryBuilders.termQuery("hotelName", "7天"), "索引1","索引2")
            .noMatchQuery(QueryBuilders.termQuery("hotelName", "置"));
    System.out.println(queryBuilder);
    SearchResponse response = client.prepareSearch("索引3")  
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .execute()
            .actionGet();
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics