Elasticsearch:RestClient+SearchSourceBuilder使用案例
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,1 前言RestClient是较低层的API,这里使用基于其封装的高层API,即RestHighLevelClient。需要添加的依赖如下: org.elasticsearch elast
千家信息网最后更新 2025年01月31日Elasticsearch:RestClient+SearchSourceBuilder使用案例
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 https://blog.51cto.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)字段中的词项顺序要一致
条件
查询
对象
语句
搜索
测试
字段
广东
湖人
案例
文档
版本
一致
两个
中央
仓库
代码
关键
关键词
前言
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
车牌识别数据库修复
梦幻西游卡卡现在在哪个服务器
冬奥会及冬残奥会网络安全保障
汽车行业网络安全专业人员
风火之旅如何在数据库添加商场
认可的网络安全接入控制
汇誉宁波互联网科技
单位网络安全工作
广安软件开发定做
国家网络安全宣传周知识要点
锋青网络技术有限公司
查询数据库所有值
北京华为鲲鹏服务器代理商
百度翻譯软件开发
公司服务器架构图
地质灾害数据库怎么建立
中英文数据库及检索方法
幼儿园关于网络安全工作规划
虚拟服务器技术的理解
校园网络安全实施方案
无线广域网络技术
贸易软件开发方案
南充市公安局网络安全大队
服务器暂不可用盗贼之海
远程访问数据库 安全
淮安计算机网络技术
dnf台服免费代理服务器
ccat软件开发工程师有用吗
数据库向导创建表结构
msds物料安全性数据库