ElasticSearchHighLevelRESTAPI【5】使⽤模板搜索
ElasticSearch Rest⾼级API 提供了多种搜索⽅式,除了前⾯讲到的arch查询,ElasticSearch 还提供了通过模板搜索查询。我个⼈⽐较喜欢这种⽅式。
我们可以通过脚本预选注册模板,在注册模板时定义⼀个模板名称。在查询时通过模板名称调⽤该模板。⾸先演⽰下如何注册模板:
public void registTemplate(){
RestClient restClient = RestClient();
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_arch");
scriptRequest1.tJsonEntity(template);
tamatotry {
restClient.performRequest(scriptRequest1);
restClient.clo();
} catch (IOException e) {
e.printStackTrace();
}
}
由于ElasticSearch 6.5版本的⾼级Rest API中暂时还没有提供⽤于注册模板的存储脚本,所以本⽰例中使⽤的低级REST客户端。本⽰例中注册了⼀个名为“title_arch”的模板
有了这个模板就可以通过“title_arch”去调⽤,动态的将查询参数添加到模板中去。模板调⽤⽰例如下:
public void templateSearch(){
RestHighLevelClient client = RestHighLevelClient();
try {
SearchTemplateRequest request = new SearchTemplateRequest();
cea
request.tRequest(new SearchRequest("posts"));
request.tScriptType(ScriptType.STORED);
request.tScript("title_arch");
全国大学英语四六级考试报名官网Map<String, Object> params = new HashMap<>();
params.put("key", "name");
params.put("value", "福卖福");
巴拿巴
params.put("size", 5);
request.tScriptParams(params);
try {
SearchTemplateRespon archTemplateRespon = client.archTemplate(request, RequestOptions.DEFAULT);
SearchHit[] hits = Respon().getHits().getHits();
for (SearchHit hit : hits) {
System.out.SourceAsString());
}
client.clo();
} catch (IOException e) {
e.printStackTrace();
kangaroo
}
} catch (Exception e) {
e.printStackTrace();
}
}
针对每个模板我们执⾏⼀次搜索请求,如果我们⼯作中针对同⼀模板可能会有不⽌⼀次的请求,如果每个请求都去单独执⾏的话未免有点繁琐。我们可以通过marchTemplate
来实现⼀次请求实现多条搜索,⽰例如下:
public void multiTemplateSearch(){
RestHighLevelClient client = RestHighLevelClient();
String [] archTerms = {"周⼤福", "特博⼠", "詹姆斯"}; // 要搜索的条件
MultiSearchTemplateRequest multiRequest = new MultiSearchTemplateRequest();
for (String archTerm : archTerms) {
SearchTemplateRequest request = new SearchTemplateRequest();
kattun
request.tRequest(new SearchRequest("posts")); //指定为posts索引库
request.tScriptType(ScriptType.INLINE);
request.tScript(
"{\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", archTerm);
scriptParams.put("size", 5);
request.tScriptParams(scriptParams);
multiRequest.add(request);
}
//执⾏查询
try {
MultiSearchTemplateRespon multiRespon = client.marchTemplate(multiRequest, RequestOptions.DEFAULT);
//返回⼀组响应,每个请求对应⼀个响应
for (MultiSearchTemplateRespon.Item item : Respons()) {
if (item.isFailure()) {
String error = FailureMessage(); //搜索请求失败返回错误信息
abe}el {
SearchTemplateRespon archTemplateRespon = Respon();
SearchRespon respon = Respon();快速有效的祛斑方法
SearchHits hits = Hits();
the fray
System.out.println("----------");
for (SearchHit hit : hits) {
System.out.SourceAsString());
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
执⾏结果如下