elastic search7 java开发简单教程

1. 编写目的

简要介绍elastic search 7 的java开发过程。

2. 具体内容

  1. 依赖包引入。

    <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
     <dependency>
         <groupId>org.elasticsearch</groupId>
         <artifactId>elasticsearch</artifactId>
         <version>7.2.0</version>
     </dependency>
     <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client -->
     <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>elasticsearch-rest-high-level-client</artifactId>
         <version>7.2.0</version>
     </dependency>
    
  2. 基本过程介绍。

    1. 建立es连接,获得RestHighLevelClient类的对象。
    2. 调用client的方法,进行根据单个键值对查询,并在try-catch-finally的finally中调用client.close();
  3. 创建与删除索引(可理解为数据库)

    @Test
    public void testCreate() throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("服务器地址", 9200, "http")));
        CreateIndexRequest request = new CreateIndexRequest("myindex2");
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        assert createIndexResponse.isAcknowledged();
        client.close();
    }
        @Test
    public void testDelete() throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("es.smileyan.cn", 9200, "http")));
        DeleteIndexRequest request = new DeleteIndexRequest("myindex2");
        client.indices().delete(request, RequestOptions.DEFAULT);
        client.close();
    }
    
  4. 几个详细例子。

    1. 根据多个键值对进行查询。
      具体代码如下:

      /**
       * 多条件查询
       * @param mustMap
       * @param length
       * @return
       */
      public static List<String> multiSearch(Map<String,Object> mustMap,int length) {
          // 根据多个条件 生成 boolQueryBuilder
          BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
          
      	// 循环添加多个条件
          for (Map.Entry<String, Object> entry : mustMap.entrySet()) {
              boolQueryBuilder.must(QueryBuilders
                              .matchQuery(entry.getKey(), entry.getValue()));
          }
      
          // boolQueryBuilder生效
          SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
          searchSourceBuilder.query(boolQueryBuilder);
          searchSourceBuilder.size(length);
      	
          // 其中listSearchResult是自己编写的方法,以供多中查询方式使用。
          return listSearchResult(searchSourceBuilder);
      }
      

      getRestHighLevelClient方法是获得client的方法,并且里面需要制定ES_URL与ES_PORT,即Elastic Search的服务地址以及服务端口。

      listSearchResult方法是根据searchSourceBuilder来提交查询请求,并且获得查询结果,以List 的格式返回。

      /**
       * getRestHighLevelClient
       * @return
       */
      public static RestHighLevelClient getRestHighLevelClient() {
          RestHighLevelClient client = new RestHighLevelClient(
              RestClient.builder(new HttpHost(ES_URL, ES_PORT, "http")));
          return client;
      }
      
      /**
       * 用来处理搜索结果,转换成链表
       * @param builder
       * @return
       */
      public static List<String> listSearchResult(SearchSourceBuilder builder) {
          // 提交查询
          SearchRequest searchRequest = new SearchRequest(ES_NAME);
          searchRequest.source(builder);
          RestHighLevelClient client = getRestHighLevelClient();
          
          // 获得response
          SearchResponse searchResponse = null;
          try {
              searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if(client != null) {
                  try {
                      client.close();
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
      
          // 从response中获得结果
          List<String> list = new LinkedList<>();
          SearchHits hits = searchResponse.getHits();
          Iterator<SearchHit> iterator = hits.iterator();
          while(iterator.hasNext()) {
              SearchHit next = iterator.next();
              list.add(next.getSourceAsString());
          }
          return list;
      }
      
    2. 根据单个键值对进行查询。

      /**
       * 根据单个属性查询
       * @param key
       * @param value
       * @param length
       * @return
       */
      public static List<String> simpleSearch(String key,Object value,int length) {
          // 使用上面已经编写好的方法
      	Map<String,Object> map = new HashMap<>();
          map.put(key,value);
          return multiSearch(map,length);
      }
      
    3. 根据时间查询。

      /**
       * 根据时间段去查询
       * @param length
       * @return
       */
      public static List<String> searchByDate(Date from,Date to,int length) {
          // 生成builder
          RangeQueryBuilder rangeQueryBuilder = 
              				QueryBuilders.rangeQuery("date").from(from).to(to);
      
          /// boolQueryBuilder生效
          SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
          searchSourceBuilder.query(rangeQueryBuilder);
          searchSourceBuilder.size(length);
      
          return listSearchResult(searchSourceBuilder);
      }
      
    4. 删除索引。

      也可以说是整个文档(数据库)。

      /**
       * 删除es的整个数据库
       * @param id
       * @return
       * @throws IOException
       */
      public static boolean delete() throws IOException {
          RestHighLevelClient client = getRestHighLevelClient();
          DeleteIndexRequest request = 
              			new DeleteIndexRequest(ElasticSearchUtil.ES_NAME);
          client.indices().delete(request, RequestOptions.DEFAULT);
          return true;
      }
      
    5. 模糊查询

      模糊查询官方文档主要提供四种方法,相关信息如下:

      • 文档地址: https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.2/java-term-level-queries.html
      • prefix query:找到以指定的具体的字符串开头的文档。
      • wildcard query: 查找指定字段包含与指定模式匹配的术语的文档,其中模式支持单字符通配符(?)和多字符通配符(*)
      • regexp query: 查找指定字段包含与指定正则表达式匹配的术语的文档。
      • fuzzy query: 查找指定字段包含与指定术语模糊相似的术语的文档。模糊度是以水平编辑距离1或2来衡量的。

      与上面查找方法类似,代码如下:

      /**
       * 后文段模糊查找方法,可以理解为 like value?
       * @param key
       * @param prefix
       * @param size
       * @return
       */
      public static List<String> fuzzy(String key, String prefix,int size) {
          PrefixQueryBuilder builder = QueryBuilders.prefixQuery(key, prefix);
          SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
          searchSourceBuilder.size(size);
          searchSourceBuilder.query(builder);
          return listSearchResult(searchSourceBuilder);
      }
      

3. 总结

因为RestHighLevelClient类是对es常用操作的封装,所以使用这个类的对象来完成操作es是比较简单的,不需要编写query语句。

Smileyan

2019年7月6日

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值