Search API - Search Template

优质
小牛编辑
134浏览
2023-12-01

Search Template

首先查看 Search Template 文档

/_search/template endpoint 允许我们在执行搜索请求和使用模板参数填充现有模板之前,能够使用 mustache 语言预先呈现搜索请求。

将模板参数定义为 Map <String,Object>

  1. Map<String, Object> template_params = new HashMap<>();
  2. template_params.put("param_gender", "male");

可以在config/scripts中使用存储的 search templates。 例如,有一个名为 config/scripts/template_gender.mustache 的文件,其中包含:

  1. {
  2. "query" : {
  3. "match" : {
  4. "gender" : "{{param_gender}}"
  5. }
  6. }
  7. }

创建search templates 请求:

  1. SearchResponse sr = new SearchTemplateRequestBuilder(client)
  2. .setScript("template_gender") //template 名
  3. .setScriptType(ScriptService.ScriptType.FILE) //template 存储在 gender_template.mustache 磁盘上
  4. .setScriptParams(template_params) //参数
  5. .setRequest(new SearchRequest()) //设置执行的context(ie: 这里定义索引名称)
  6. .get()
  7. .getResponse();

还可以将 template 存储在 cluster state 中:

cluster state是全局性信息, 包含了整个群集中所有分片的元信息(规则, 位置, 大小等信息), 并保持每个每节的信息同步。 参考: 《为什么ElasticSearch应用开发者需要了解cluster state》

  1. client.admin().cluster().preparePutStoredScript()
  2. .setScriptLang("mustache")
  3. .setId("template_gender")
  4. .setSource(new BytesArray(
  5. "{\n" +
  6. " \"query\" : {\n" +
  7. " \"match\" : {\n" +
  8. " \"gender\" : \"{{param_gender}}\"\n" +
  9. " }\n" +
  10. " }\n" +
  11. "}")).get();

使用ScriptService.ScriptType.STORED 执行一个存储的 templates:

  1. SearchResponse sr = new SearchTemplateRequestBuilder(client)
  2. .setScript("template_gender") //template 名
  3. .setScriptType(ScriptType.STORED) //template 存储在 cluster state 上
  4. .setScriptParams(template_params) //参数
  5. .setRequest(new SearchRequest()) //设置执行的context(ie: 这里定义索引名称)
  6. .get() //执行获取template 请求
  7. .getResponse();

也可以执行 内联(inline) templates

  1. sr = new SearchTemplateRequestBuilder(client)
  2. .setScript("{\n" + //template 名
  3. " \"query\" : {\n" +
  4. " \"match\" : {\n" +
  5. " \"gender\" : \"{{param_gender}}\"\n" +
  6. " }\n" +
  7. " }\n" +
  8. "}")
  9. .setScriptType(ScriptType.INLINE) //template 是内联传递的
  10. .setScriptParams(template_params) //参数
  11. .setRequest(new SearchRequest()) //设置执行的context(ie: 这里定义索引名称)
  12. .get() //执行获取template 请求
  13. .getResponse();