ElasticSearch【5】模板搜索API

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();
        }
    }

执行结果如下

原文地址:https://www.cnblogs.com/chentop/p/10297889.html

时间: 2024-10-10 08:49:19

ElasticSearch【5】模板搜索API的相关文章

elasticsearch实现网站搜索

使用elasticsearch 实现网站搜索,可以支持商品搜索,筛选项过滤搜索 ,价格排序, 打分 筛选项聚合,还有其他综合排序 后续推出搜索人工干预排序,根据销量,好评率,售卖率 进行全方位的搜索实现 想要完全理解此搜索项目 需要学习以下我之前写过的知识 ElasticSearch6.0 索引模板 http://www.cnblogs.com/shoutn/p/8274893.html ElasticSearch6.0 高级应用之 多字段聚合Aggregation(二) http://www.

elasticsearch中常用的API

elasticsearch中常用的API分类如下: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作,查看索引信息等 查看API: 按照更直观的形式返回数据,更适用于控制台请求展示 集群API: 对集群进行查看和操作的API 下面简单的一一介绍记录一下. 文档类API Index API: 创建并建立索引 PUT twitter/tweet/1{ "user" : "kimchy", "p

jsonp跨越请求百度搜索api,实现下拉列表提示

题目来源: 最近在做百度IFE前端技术学院的题,然后有一题就是模拟百度搜索智能提示.题目是开源的,稍后给出地址. 因为博主没学过后端啊,欲哭无泪,所以不能实现后端模糊搜索,那如果前端ajax纯粹请求一份同样的数据,效果就不好. 机智的博主直接把百度搜索api借来一下. 直接从开发者工具,监控网络,找到请求地址. 百度api: 我把api缩减了一下,删除了大部分暂时用不上的参数. https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=abc

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

HTML5+Ajax+Jquery调用Google搜索API实现搜索引擎,支持web,image,news,vedio4种模式!

原文:HTML5+Ajax+Jquery调用Google搜索API实现搜索引擎,支持web,image,news,vedio4种模式! 源代码下载地址:http://www.zuidaima.com/share/1550463589878784.htm web,image,news,vedio4种模式! 已经拿javaniu作出测试,下载即可查看 

elasticsearch的rest搜索--- 查询

目录: 一.针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 四. 查询 1. 查询的官网的文档 https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html 2.  查询的rest格式 3.  介绍用过的查询方式 一般的查询 http://blog.csdn.net/dm_vincent/article/d

jsonp跨越请求百度搜索api 实现下拉列表提示

题目来源: 最近在做百度IFE前端技术学院的题,然后有一题就是模拟百度搜索智能提示.题目是开源的,稍后给出地址. 因为博主没学过后端啊,欲哭无泪,所以不能实现后端模糊搜索,那如果前端ajax纯粹请求一份同样的数据,效果就不好. 机智的博主直接把百度搜索api借来一下. 直接从开发者工具,监控网络,找到请求地址. 百度api: 我把api缩减了一下,删除了大部分暂时用不上的参数. https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=abc

Python 和 Elasticsearch 构建简易搜索

Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如果从一种操作系统里面运行另一种操作系统,通常我们采取的策略就是引入虚拟机,比如在 Windows 系统里面运行 Linux 系统.这种方式有个很大的缺点就是资源占用多.冗余步骤多.启动慢.目前最流行的 Linux 容器解决方案之一就是Docker,它最大优点就是轻量.资源占用少.

使用Javascript从Google Places搜索api获取纬度和经度

如何使用谷歌地图搜索框api从搜索到的位置获取经度和纬度. 我使用与谷歌演示相同的代码 – https://developers.google.com/maps/documentation/javascript/examples/places-searchbox 搜索代码: <script type="text/javascript"> //自动搜索 function initMap() { var input = document.getElementById('addr