设为首页 收藏本站
查看: 5093|回复: 0

[经验分享] Elasticsearch:RestClient+SearchSourceBuilder使用案例

[复制链接]

尚未签到

发表于 2019-1-28 14:24:57 | 显示全部楼层 |阅读模式
1 前言
  RestClient是较低层的API,这里使用基于其封装的高层API,即RestHighLevelClient。
  需要添加的依赖如下:


org.elasticsearch
elasticsearch
5.6.10


org.elasticsearch.client
elasticsearch-rest-high-level-client
5.6.10

  较低版本的es可能不支持RestHighLevelClient。
查看一下其maven中央仓库:https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client
可以看到,5.6以上的版本才有。


2 测试案例
  测试代码如下:

package com.xpleaf.es.leaf;
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author xpleaf
* @GitHub https://github.com/xpleaf
* @Blog http://blog.运维网.com/xpleaf
* @date 2018/10/7 下午12:05
*/
public class RestHighLevelClientTest {
private HttpHost[] esHosts = new HttpHost[]{
new HttpHost("localhost", 9200)
};
private RestClient restClient = null;
private RestHighLevelClient client = null;
private BoolQueryBuilder boolQueryBuilder = null;
@Before
public void init() throws Exception {
// 1.创建RestClient对象
restClient = RestClient.builder(esHosts).build();
client = new RestHighLevelClient(restClient);
// 2.创建BoolQueryBuilder对象
boolQueryBuilder = new BoolQueryBuilder();
// 3.设置boolQueryBuilder条件
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders
.matchPhraseQuery("key_word", "广东");
MatchPhraseQueryBuilder matchPhraseQueryBuilder2 = QueryBuilders
.matchPhraseQuery("key_word", "湖人");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders
.rangeQuery("postdate")
.from("2016-01-01 00:00:00");
// 子boolQueryBuilder条件条件,用来表示查询条件or的关系
BoolQueryBuilder childBoolQueryBuilder = new BoolQueryBuilder()
.should(matchPhraseQueryBuilder)
.should(matchPhraseQueryBuilder2);
// 4.添加查询条件到boolQueryBuilder中
boolQueryBuilder
.must(childBoolQueryBuilder)
.must(rangeQueryBuilder);
}
// 测试SearchSourceBuilder的搜索
@Test
public void test01() throws Exception {
// 1.创建并设置SearchSourceBuilder对象
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 查询条件--->生成DSL查询语句
searchSourceBuilder.query(boolQueryBuilder);
// 第几页
searchSourceBuilder.from(0);
// 每页多少条数据
searchSourceBuilder.size(100);
// 获取的字段(列)和不需要获取的列
searchSourceBuilder.fetchSource(new String[]{"postdate", "key_word"}, new String[]{});
// 设置排序规则
searchSourceBuilder.sort("postdate", SortOrder.ASC);
// 设置超时时间为2s
searchSourceBuilder.timeout(new TimeValue(2000));
// 2.创建并设置SearchRequest对象
SearchRequest searchRequest = new SearchRequest();
// 设置request要搜索的索引和类型
searchRequest.indices("spnews").types("news");
// 设置SearchSourceBuilder查询属性
searchRequest.source(searchSourceBuilder);
// 3.查询
SearchResponse searchResponse = client.search(searchRequest);
System.out.println(searchResponse.toString());
}
@After
public void after() throws Exception {
restClient.close();
}
}
3 分析

3.1 Rest Json
  上面测试案例的查询条件:

// 2.创建BoolQueryBuilder对象
boolQueryBuilder = new BoolQueryBuilder();
// 3.设置boolQueryBuilder条件
MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders
.matchPhraseQuery("key_word", "广东");
MatchPhraseQueryBuilder matchPhraseQueryBuilder2 = QueryBuilders
.matchPhraseQuery("key_word", "湖人");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders
.rangeQuery("postdate")
.from("2016-01-01 00:00:00");
// 子boolQueryBuilder条件条件,用来表示查询条件or的关系
BoolQueryBuilder childBoolQueryBuilder = new BoolQueryBuilder()
.should(matchPhraseQueryBuilder)
.should(matchPhraseQueryBuilder2);
// 4.添加查询条件到boolQueryBuilder中
boolQueryBuilder
.must(childBoolQueryBuilder)
.must(rangeQueryBuilder);
  实际上会转化为如下的es查询语句(可以debug一下,使用searchSourceBuilder就是用来做这种转换):

{
"from" : 0,
"size" : 100,
"timeout" : "2000ms",
"query" : {
"bool" : {
"must" : [
{
"bool" : {
"should" : [
{
"match_phrase" : {
"key_word" : {
"query" : "广东",
"slop" : 0,
"boost" : 1.0
}
}
},
{
"match_phrase" : {
"key_word" : {
"query" : "湖人",
"slop" : 0,
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
{
"range" : {
"postdate" : {
"from" : "2016-01-01 00:00:00",
"to" : null,
"include_lower" : true,
"include_upper" : true,
"boost" : 1.0
}
}
}
],
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0
}
},
"_source" : {
"includes" : [
"postdate",
"key_word"
],
"excludes" : [ ]
},
"sort" : [
{
"postdate" : {
"order" : "asc"
}
}
]
}
3.2 match query VS match_phrase query
  注意其差别:


  • match query:会对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档就会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接;
  • match_phrase query:满足下面两个条件才会被搜索到

    • (1)分词后所有词项都要出现在该字段中
    • (2)字段中的词项顺序要一致





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668803-1-1.html 上篇帖子: Elasticsearch集群数据迁移 下篇帖子: elasticsearch 的使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表