ElasticSearch High Level REST API【5】使用模板搜索
ElasticSearch Rest高级API 提供了多种搜索方式,除了前面讲到的search查询,ElasticSearch 还提供了通过模板搜索查询。我个人比较喜欢这种方式。
我们可以通过脚本预选注册模板,在注册模板时定义一个模板名称。在查询时通过模板名称调用该模板。首先演示下如何注册模板:
public void registTemplate(){
RestClient restClient = elasticClient.getRestClient();
String template = "{\n" +
" \"script\":{\n" +
" \"lang\":\"mustache\",\n" +
" \"source\":{\n" +
" \"query\":{\n" +
" \"match\":{\n" +
" \"{{key}}\":\"{{value}}\"\n" +
" }\n" +
" },\n" +
" \"size\":\"{{size}}\"\n" +
" }\n" +
" }\n" +
"}";
Request scriptRequest1 = new Request("POST", "_scripts/title_search");
scriptRequest1.setJsonEntity(template); try {
restClient.performRequest(scriptRequest1);
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
由于ElasticSearch 6.5版本的高级Rest API中暂时还没有提供用于注册模板的存储脚本,所以本示例中使用的低级REST客户端。本示例中注册了一个名为“title_search”的模板
有了这个模板就可以通过“title_search”去调用,动态的将查询参数添加到模板中去。模板调用示例如下:
public void templateSearch(){
RestHighLevelClient client = elasticClient.getRestHighLevelClient();
try {
SearchTemplateRequest request = new SearchTemplateRequest();
request.setRequest(new SearchRequest("posts")); request.setScriptType(ScriptType.STORED);
request.setScript("title_search"); Map<String, Object> params = new HashMap<>();
params.put("key", "name");
params.put("value", "福卖福");
params.put("size", 5);
request.setScriptParams(params);
try {
SearchTemplateResponse searchTemplateResponse = client.searchTemplate(request, RequestOptions.DEFAULT);
SearchHit[] hits = searchTemplateResponse.getResponse().getHits().getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
client.close();
} catch (IOException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
针对每个模板我们执行一次搜索请求,如果我们工作中针对同一模板可能会有不止一次的请求,如果每个请求都去单独执行的话未免有点繁琐。我们可以通过msearchTemplate
来实现一次请求实现多条搜索,示例如下:
public void multiTemplateSearch(){
RestHighLevelClient client = elasticClient.getRestHighLevelClient();
String [] searchTerms = {"周大福", "特博士", "詹姆斯"}; // 要搜索的条件
MultiSearchTemplateRequest multiRequest = new MultiSearchTemplateRequest();
for (String searchTerm : searchTerms) {
SearchTemplateRequest request = new SearchTemplateRequest();
request.setRequest(new SearchRequest("posts")); //指定为posts索引库 request.setScriptType(ScriptType.INLINE);
request.setScript(
"{\n" +
" \"query\":{\n" +
" \"match\":{\n" +
" \"{{key}}\":\"{{value}}\"\n" +
" }\n" +
" },\n" +
" \"size\":\"{{size}}\"\n" +
"}"); Map<String, Object> scriptParams = new HashMap<>();
//向模板中填充对应值
scriptParams.put("key", "name");
scriptParams.put("value", searchTerm);
scriptParams.put("size", 5);
request.setScriptParams(scriptParams); multiRequest.add(request);
}
//执行查询
try {
MultiSearchTemplateResponse multiResponse = client.msearchTemplate(multiRequest, RequestOptions.DEFAULT);
//返回一组响应 ,每个请求对应一个响应
for (MultiSearchTemplateResponse.Item item : multiResponse.getResponses()) {
if (item.isFailure()) {
String error = item.getFailureMessage(); //搜索请求失败返回错误信息
}else {
SearchTemplateResponse searchTemplateResponse = item.getResponse();
SearchResponse response = searchTemplateResponse.getResponse();
SearchHits hits = response.getHits();
System.out.println("----------");
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
执行结果如下
ElasticSearch High Level REST API【5】使用模板搜索的更多相关文章
- ElasticSearch High Level REST API【2】搜索查询
如下为一段带有分页的简单搜索查询示例 在search搜索中大部分的搜索条件添加都可通过设置SearchSourceBuilder来实现,然后将SearchSourceBuilder RestHighL ...
- ElasticSearch High Level REST API【4】多搜索
1.Multi-Search多搜索请求 Multi-Search可同时添加多个search搜索请求,并行地在一个http请求中执行多个搜索请求,相较多次单请求查询可提升查询效率.ES客户掉通过mget ...
- ElasticSearch High Level REST API【6】获取集群信息
ElasticSearch 可以通过info()方法检索群集信息: public void info(){ RestHighLevelClient client = elasticClient.get ...
- ElasticSearch High Level REST API【7】聚合
获取平均值聚合示例,最大值.最小值.求和类似 public void aggregation(){ RestHighLevelClient client = elasticClient.getRest ...
- ElasticSearch High Level REST API【3】Scroll 滚屏
ES中提供了 FROM/SIZE 分页,但这种分页有性能瓶颈. Scroll会以间隔时间滚屏的方式返回全部的查询数据,可以作为数据量很大的情况下,分页的一个替代方案 完整的示例如下: public v ...
- ElasticSearch High Level REST API【1】文档基本操作
获取ES客户端 ES的提供了四种Java客户端,分别为节点客户端(node client).传输客户端(Transport Client).低级REST客户端.高级REST客户端. 节点客户端作为集群 ...
- Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...
- Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...
- elasticsearch中常用的API
elasticsearch中常用的API分类如下: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作,查看索引信息等 查看API: ...
随机推荐
- 机器学习(四) SVM 支持向量机
svr_linear = SVR('linear') #基于直线 svr_rbf = SVR('rbf') #基于半径 svr_poly = SVR('poly') #基于多项式
- 在邮箱服务器上执行Powershell命令Get-MessageTrackingLog 报错
开启对应的服务即可. 中文环境: 英文环境:
- Win10家庭版打不开gpedit.msc
本文来源 : https://www.ithome.com/html/win10/324926.htm win10家庭版是不自带这个功能的 首先我们打开记事本,并输入以下内容(注意空格): @echo ...
- java对象在内存中的分配
java对象在内存中的分配 http://blog.csdn.net/qq_30753945/article/details/54974899
- 关于jetty的那些奇葩问题
Jetty的解压目录并不像Tomcat那样直接是在webapps下,如果你什么都不做修改的话,Ubuntu14.04下Jetty的默认解压目录是/var/cache/jetty/data/下: 比如我 ...
- 性能测试学习第十一天_Analysis
Analysis的功能:对测试运行结果进行查看,分析和比较 导入分析文件:loadrunner results文件和analysis session文件 Analysis窗口: 1.会话浏览器窗格 2 ...
- Java并发编程的艺术,解读并发编程的优缺点
并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...
- linux启动mysql报错 Starting MySQL... ERROR! The server quit without updating PID file (XXXX pid文件位置)
最近在云服务器上安装mysql 启动时报错了,从错误中可以看出,定位在pid文件上,有三种解决方案 1.重启服务器:因为服务器更新时,可能会禁用某些守护进程,重启后即可恢复 2.删除配置文件,重启试 ...
- java 整型相除得到浮点型
public class TestFloatOrDouble { public static void main(String[] args) { Point num1 = new Point(84, ...
- metaclass元类解析
一.创建类的流程 二.什么是元类 在Python3中继承type的就是元类 示例 # 方式一 class MyType(type): '''继承type的就是元类''' def __init__(se ...