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日

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引,它提供了强大的全文搜索、实时数据分析和数据可视化功能。对于Java开发者来说,Elasticsearch提供了Java API,方便进行与Elasticsearch的交互和操作。 以下是一些推荐的Elasticsearch Java开发文档: 1. 官方文档:Elasticsearch官方提供了详细的Java API文档,包含了各种操作和用法的示例代码。你可以在Elasticsearch官方网站上找到这些文档。 2. Elasticsearch Java客户端库:Elasticsearch官方提供了一个Java客户端库,名为"elasticsearch"。你可以在Maven或Gradle等构建工具中添加相应的依赖,然后通过该库来进行Elasticsearch的操作。该库提供了丰富的API,包括索引、搜索、聚合等功能。 3. Spring Data Elasticsearch:如果你使用Spring框架进行开发,可以考虑使用Spring Data Elasticsearch。它是Spring Data项目的一部分,提供了对Elasticsearch的集成支持。通过Spring Data Elasticsearch,你可以使用简单的注解和接口定义来进行Elasticsearch的操作。 4. Elasticsearch Java REST客户端:除了使用Java API和客户端库外,你还可以使用Elasticsearch的REST API来进行操作。Elasticsearch提供了一个Java REST客户端,你可以通过HTTP请求与Elasticsearch进行通信。你可以在Elasticsearch官方文档中找到有关Java REST客户端的详细信息。 希望以上推荐的文档能够帮助你开始Elasticsearch Java开发。如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值