前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch7.3在java中的简单连接

Elasticsearch7.3在java中的简单连接

作者头像
陈哈哈
发布2020-07-06 10:49:15
2.4K0
发布2020-07-06 10:49:15
举报
文章被收录于专栏:MySQL入坑记MySQL入坑记

上周我们新项目的开发使用的检索引擎确定为Elasticsearch7.3.1,伴随着好奇心我赶快查查这个版本ES的入坑率。

开心,ES7.3.1版本的发布周期还不到10天,设计人员简直是神仙!

心中一顿happy乱喷后,赶快上网搜索了一番ES7.3的java开发说明。由于之前用过ES1和ES5版本,知道小版本之间的API应该是通用的,会不会大版本间也能通用呢?

很显然,如果通用我就不写这篇入坑指南了。

之前我们用的一直是Spring追踪更新的transport包(如下图)

但很可惜,当前最新的Spring-elastiscsearch只更新到ES6.7,ES7不能使。唉,赶快找其他的小厂家插件。。后来找到了款ES7官网API推荐的包elasticsearch-rest-high-level-client,废话不多说,进入快速入门模式——>

1.引入高版本jar

如下图,ES7.x都有相应包,修改版本号即可

代码语言:javascript
复制
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
	  <dependency>
		  <groupId>org.elasticsearch</groupId>
		  <artifactId>elasticsearch</artifactId>
		  <version>7.3.1</version>
	  </dependency>
      <dependency>
          <groupId>org.elasticsearch.client</groupId>
          <artifactId>elasticsearch-rest-high-level-client</artifactId>
          <version>7.3.1</version>
      </dependency>

2.编写demo代码

这里由于不是Spring的包,不需要加什么xml配置文件了,直接使用即可,啥都不说了,都在代码里了!仔细阅读下方的注释,我就不在这里多BB了(划重点)

代码语言:javascript
复制
   /**
     * 查询phoneList
     * @param
     * @return
     */
    @RequestMapping(value = "/selPhoneList", produces = "text/html;charset=UTF-8")
    @ResponseBody
    public JSONObject selPhoneList(String jmpt_name, String mobileLocation, String pageSize, String currentPage) {
        
        // 引入client,配置按各自修改
        RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("127.0.0.1", "9200", "http")));

    	JSONObject resJSON = new JSONObject();
    	JSONArray jsonArr = new JSONArray();
    	int currentPageInt = 0;
    	int pageSizeInt = 10;
        // 提取分页参数
        if (jmpt_name == null || "undefined".equals(jmpt_name)) {
            jmpt_name = "";
        }
        if (mobileLocation == null || "undefined".equals(mobileLocation)) {
            mobileLocation = "";
        }
        if (pageSize != null && !"".equals(pageSize)) {
            pageSizeInt = Integer.parseInt(pageSize);
        }
        if (currentPage != null && !"".equals(currentPage)) {
            currentPageInt = Integer.parseInt(currentPage) * pageSizeInt;
        }
        
        // 查询流程***(重要):子查询对象(QueryBuilder)-->父查询对象(BoolQueryBuilder)-->查询函数构造对象(SearchSourceBuilder)-->请求发起对象(SearchRequest )-->发起请求-->返回结果(SearchResponse)
        // 创建父查询对象
        BoolQueryBuilder srBuilder = QueryBuilders.boolQuery();
        // 创建子查询对象
        QueryBuilder jmpt_nameBuilder = null;
        QueryBuilder locationBuilder = null;
        // 创建查询函数构造对象
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        System.out.println("打印提交的DSL语句:sourceBuilder--:" + sourceBuilder);
        // 参数注入到
        if (!"".equals(jmpt_name)){
            jmpt_nameBuilder = QueryBuilders.queryStringQuery(jmpt_name).field("jmpt_name");// 根据字段平台名称(jmpt_name)进行查询
            srBuilder.must(jmpt_nameBuilder);//子查询对象放入父查询对象中
        }
        if (!"".equals(mobileLocation)){
            locationBuilder = QueryBuilders.queryStringQuery(mobileLocation).field("provience");// 根据字段省份(field:provience)进行查询

            srBuilder.must(locationBuilder);//子查询对象放入父查询对象中
        }

        sourceBuilder.query(srBuilder); // 把父查询对象放入函数构造对象中
        sourceBuilder.from(currentPageInt); // 参数范围起
        sourceBuilder.size(pageSizeInt); // 参数范围始
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));// 设置超时时间
        sourceBuilder.trackTotalHits(true); // 取消默认最大查询数量上限(默认10000)

        // 构造 请求发起对象
        SearchRequest searchRequest = new SearchRequest("phone");// 这里直接配置索引名即可
        // searchRequest.indices("phone");
        searchRequest.source(sourceBuilder);// 把查询函数构造对象注入查询请求中
        SearchResponse searchResponse;// 创建响应对象

        SearchHits searchHits = null;
        try {
            searchResponse = this.client.search(searchRequest,RequestOptions.DEFAULT);
            searchHits =  searchResponse.getHits();//获取响应中的列表数据
            String total = searchHits.getTotalHits().value;//获取响应中的列表数据总数

            for(SearchHit hit:searchHits.getHits()){// 遍历构造返回JSON,以下不再多说
                JSONObject dataJSON = new JSONObject();
                String tempRes = hit.getSourceAsString();
                dataJSON = JSONObject.parseObject(tempRes);
                jsonArr.add(dataJSON);
            }

            resJSON.put("resArr", jsonArr);
            resJSON.put("total", total);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return resJSON;
    }

好了,上面是最基本的一个查询方式demo,其他的查询需要不同的父查询函数,后面我会继续更新。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.引入高版本jar
  • 2.编写demo代码
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档