文档章节

Elasticsearch Compound Query 复合查询详解

杨小杨
 杨小杨
发布于 2016/06/25 16:25
字数 894
阅读 1226
收藏 17

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();

6、 and Query

与 请求查询,要求必须满足所有term查询 如下实例:hotelName 必须同时满足 7 和 天 两个term查询 不过现在该方法再client已经标记为过时,推荐使用boolQuery 的must来实现

QueryBuilder queryBuilder = QueryBuilders.andQuery(QueryBuilders.termQuery("hotelName", "7")).add(QueryBuilders.termQuery("hotelName", "天"));
相当于
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("hotelName", "7")).must(QueryBuilders.termQuery("hotelName", "天"));

7、 or query

或 请求查询,要求满足其中一个term查询即可,现在也属于过时的方法,推荐使用boolQuery来代替。 略过,

8、 filtered Query

过滤查询: 根据第一个term来查询结果,通过第二个term进行过滤 已经标记为过时方法:推荐使用:boolQuery的 must来实现 如下实例:查询hotelName 为 "7"的文档,并过滤hotelName为天的作为结果文档

QueryBuilder queryBuilder = QueryBuilders.filteredQuery(QueryBuilders.termQuery("hotelName", "7"),QueryBuilders.termQuery("hotelName","天"));

9、limit Query

没实现出来,通过看源代码提示结合文档,得出如下结论 限制每个分片的检索数量,已经标记为过时 ,通过SearchRequestBuilder#setTerminateAfter(int) 代替实现 如下实例:没个分片查询1个数据,

QueryBuilder queryBuilder = QueryBuilders.termQuery("hotelName","酒");
    System.out.println(queryBuilder);
    SearchResponse response = client.prepareSearch("titan_hotel")
            .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
            .setQuery(queryBuilder).setTerminateAfter(1)
            .execute()
            .actionGet();

© 著作权归作者所有

共有 人打赏支持
杨小杨
粉丝 22
博文 43
码字总数 11499
作品 0
昌平
程序员
私信 提问
蛋疼的ElasticSearch(四)之基本用法、高级查询

ElasticSearch系列文章: 1.蛋疼的ElasticSearch(一)之安装ElasticSearch 2.蛋疼的ElasticSearch(二)之配置ElasticSearch Head插件 3.蛋疼的ElasticSearch(三)之配置elasticsearch-analysis-......

cmazxiaoma
10/25
0
0
spring-data-elasticsearch 实战案例详解(四)

本文提纲 一、搜索实战场景需求 二、运行 spring-data-elasticsearch-query 工程 三、spring-data-elasticsearch-query 工程代码详解 一、搜索实战场景需求 搜索的场景会很多,常用的搜索场景...

夜黑人模糊灬
05/13
0
0
如何用 Node.js 和 Elasticsearch 构建搜索引擎

Elasticsearch 是一款开源的搜索引擎,由于其高性能和分布式系统架构而备受关注。本文将讨论其关键特性,并手把手教你如何用它创建 Node.js 搜索引擎。 Elasticsearch 概述 Elasticsearch 底...

oschina
2016/09/29
10.2K
6
spring-data-elasticsearch 基本案例详解(三)

『 风云说:能分享自己职位的知识的领导是个好领导。 』 运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+, Spring Data Elasticsearch 1.5+ ,ElasticSearch 2.3.2 本文提纲 一、...

夜黑人模糊灬
05/13
0
0
机器学习利用 Elasticsearch 进行更智能搜索

众所周知,机器学习正在引领许多行业的变革。对于曾疲于用人工调整搜索相关性来捕捉细微差别的搜索行业就更是如此。人工调整已经实现了其能达到的最好效果,成熟的搜索公司不满足于此,试图建...

oschina
2017/03/03
5K
5

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
45分钟前
1
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
48分钟前
1
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
1
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
1
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部