java ElasticSearch的实用功能

这篇博客详细介绍了如何使用Elasticsearch进行索引创建、查询、更新和删除等基本操作。包括创建索引、查询索引信息、删除索引、添加和更新文档的内容,以及各种查询条件的构建。还涵盖了实用的更新方法,如通过脚本进行数据更新,以及查询后排序转换为对象的示例。此外,文章强调了类的多样性和繁琐性,并提出了统一接口的建议,以简化操作流程。
摘要由CSDN通过智能技术生成

创建索引

        CreateIndexRequest index = new CreateIndexRequest("book");
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(index, RequestOptions.DEFAULT);
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged);

查询索引

		GetIndexRequest request=new GetIndexRequest("user");
		GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
		System.out.println(getIndexResponse.getAliases());
		System.out.println(getIndexResponse.getMappings());
		System.out.println(getIndexResponse.getSettings());

删除索引

       DeleteIndexRequest request=new DeleteIndexRequest("book");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());

添加文档

IndexRequest request=new IndexRequest();
//不指定id则自动创建id
        request.index("book").id("1011");
        Book book=new Book();
//        book.setId(1);
        book.setName("书籍‘");
        String s = JSON.toJSONString(book);
        request.source(s,XContentType.JSON);
        IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(index.getResult());

更新

        UpdateRequest request=new UpdateRequest();
        request.index("book").id("1011");
        request.doc(XContentType.JSON,"name","jj");
        UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(update.getResult());

实用的更新(查询后更新)

UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("索引名");
    updateByQueryRequest.setQuery(new TermQueryBuilder("esopEnterpriseId", information.getTktEnterpriseInformationId()));
    Map<String, Object> params = new HashMap<>();
    params.put("dataState", information.getDataState());
    params.put("dataStateStr",information.getDataStateStr());
    script设置的是脚本, Script 构造器(脚本类型, 语言, 命令, 传入参数)
//脚本类型分为: ScriptType.INLINE 和 ScriptType.STORED
//lang语言 painless 是es自带的
    Script script = new Script(ScriptType.INLINE, "painless", "ctx._source.dataState=params.dataState;ctx._source.dataStateStr=params.dataStateStr", params);
    updateByQueryRequest.setScript(script);
    restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);

查询(精确匹配)

`        SearchRequest request=new SearchRequest();
        request.indices("book");
        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name","1")));
        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("id","1")));
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);`

多条件查询

            SearchRequest request1 = new SearchRequest("titems");
            //构建搜索条件
            SearchSourceBuilder builder = new SearchSourceBuilder();
            //按照颜色查询方法,其中keyword表示不分词匹配,把该词当成一个整体
            //像这种不分词查询的一般都会再mapping中设置为keyword类型
            //QueryBuilders.matchQuery()表示模糊查询,所谓的模糊查询就是分词查询
            //QueryBuilders.termQuery()表示精确查询,不会拆分
            //上面两个如果字段是keyword类型则都是精确匹配查询
            //条件判断,如果传入的属性为空的话则不执行该查询条件
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            if(null != req.getItem_brand()){
            //must就相当于一个and
              boolQueryBuilder.must(QueryBuilders.matchQuery("item_brand.keyword", req.getItem_brand()));
            }
            if(null != req.getItem_color()){
                boolQueryBuilder.must(QueryBuilders.matchQuery("item_color.keyword", req.getItem_color()));
            }
            //should就相当于or
            //QueryBuilders.boolQuery().should(QueryBuilders.matchQuery()).should()
            //单条件查询
//            MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("item_color.keyword", req.getItem_color());
            builder.query(boolQueryBuilder);

查询后排序然后转为对象

//1. 创建Request
      SearchRequest request = new SearchRequest(EsopEnterpriseInformationConstant.ES_ESOP_ENTERPRISE_INDEX_NAME);
      //2. 指定查询条件
      SearchSourceBuilder builder = new SearchSourceBuilder();
      builder.query(QueryBuilders.matchAllQuery());
      builder.size(10000);
      builder.sort("busiRegCityCode", SortOrder.ASC);
      builder.sort("busiRegCountyCode",SortOrder.ASC);
      builder.sort("busiRegGridCode",SortOrder.ASC);
      request.source(builder);
      //3. 执行查询
      SearchResponse resp = null;
      try {
          resp = restHighLevelClient.search(request, RequestOptions.DEFAULT);
      } catch (IOException e) {
          e.printStackTrace();
      }
      List<ESEnterpriseInformation> list=new ArrayList<>();
      for (SearchHit hit : resp.getHits().getHits()) {
          String sourceAsString = hit.getSourceAsString();
          ESEnterpriseInformation information = JSONObject.parseObject(sourceAsString, ESEnterpriseInformation.class);
          list.add(information);
      }

查询字段不为null并且不为空的数据

        SearchRequest request=new SearchRequest();
        request.indices("book");
//              多条件组合查询
        SearchSourceBuilder builder=new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //name的值必须null
        boolQueryBuilder.must(QueryBuilders.existsQuery("name"));
        //name的值必须不null
        boolQueryBuilder.must(QueryBuilders.existsQuery("name"));
        //name值不为空
        //如果字段类型为keyword就不用加.keyword,
        //在must内部,termQuery和matchQuery测试出来没什么区别
       boolQueryBuilder.mustNot(QueryBuilders.termQuery("name.keyword",""));
        builder.query(boolQueryBuilder);
        request.source(builder);
        SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);

总结大概的步骤

首先,Request,然后指定request的索引,然后如果是增删改,就要指定request的source,如果是查询,就指定request的query,这个query中的内容是一个searchQueryBuilder,而searchQueryBuilder内部需要指定查询条件,而这个条件是用QueryBuilders.termQuery或者QueryBuilders.matchQuery()或者QueryBuilders.existQuery()

我只觉得类太多了,很繁琐,以后应该将统一一个顶层接口,索引操作一个接口,文档一个接口,这样更能入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值