ElasticSearch 滚动索引

ElasticSearch 滚动索引

一个【读索引别名】关联多个索引
一个【写索引名】关联一个【最新的索引】,触发【条件阈值】后,调用滚动索引,自动【生成】新索引

注:1、最新索引同时有【写索引名】和【读索引别名】
   2、【读索引别名】关联所有索引(按照业务取舍,可选择性舍弃)

完整demo如下

1.基础准备

  <!-- elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.17.2</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.17.2</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.17.2</version>
        </dependency>
public class EsClientConstant {

    public static RestHighLevelClient ES_CLIENT = null;

    static {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "密码"));
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("192.168.31.1", 9200, "http"))
            .setHttpClientConfigCallback((httpAsyncClientBuilder) -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
        ;
        ES_CLIENT = new RestHighLevelClient(restClientBuilder);
    }
}

2、模板

2.1 创建模板(createTemplate)

 //templateName:模板名
 //templateAliases:模板别名
  public static void createTemplate(String templateName,String  templateAliases, List<String> patterns) throws Exception {
        PutIndexTemplateRequest request = new PutIndexTemplateRequest(templateName);
        request.patterns( patterns);
        request.alias(new Alias(templateAliases));
//        request.settings(Settings.builder()
//            .put("index.number_of_shards", 3)
//            .put("index.number_of_replicas", 0)
//        );

        request.mapping(TemplateConstant.getTemplate());
        // request.create(true);

//        request.masterNodeTimeout(TimeValue.timeValueMinutes(1));
//        request.masterNodeTimeout("1m");
        ES_CLIENT.indices().putTemplate(request, RequestOptions.DEFAULT);
        AcknowledgedResponse putTemplateResponse  = ES_CLIENT.indices().putTemplate(request, RequestOptions.DEFAULT);

        System.out.println("创建模板 response:" + putTemplateResponse );
        System.out.println("创建模板isAcknowledged:" + putTemplateResponse.isAcknowledged() );
    }
public class TemplateConstant {
    public  static  XContentBuilder  getTemplate() throws Exception{
        XContentBuilder  mapping = XContentFactory.jsonBuilder();
            mapping.startObject();
            {
                mapping.startObject("properties");
                {
                    //1、创建文档字段-id
                    mapping.startObject("id");
                    {
                        mapping.field("type", "text");
                    }
                    mapping.endObject();
                }
                mapping.endObject();
            }
            mapping.endObject();

        return mapping;
    }
}

2.2 删除模板

       public static void deleteTemplate(String templateName) throws IOException {
        DeleteIndexTemplateRequest request = new DeleteIndexTemplateRequest(templateName);

        AcknowledgedResponse putTemplateResponse  = ES_CLIENT.indices().deleteTemplate(request, RequestOptions.DEFAULT);
      ;
        System.out.println("删除模板 response:" + putTemplateResponse );
        System.out.println("删除模板 isAcknowledged:" + putTemplateResponse.isAcknowledged() );
    }

2.3 查询模板

   public static void queryTemplate(String templateName) throws IOException {

        GetIndexTemplatesRequest request=new GetIndexTemplatesRequest( templateName);

        GetIndexTemplatesResponse template = ES_CLIENT.indices().getIndexTemplate(request, RequestOptions.DEFAULT);
        List<IndexTemplateMetadata> templates = template.getIndexTemplates();
        System.out.println("查询模板>>>>>>>>>>>>>>>>>>>>>>>>>>  ");
        for (IndexTemplateMetadata metadata : templates) {
            System.out.println("name  "+metadata.name());
            System.out.println("aliases  "+metadata.aliases());
            System.out.println("version  "+metadata.version());
            System.out.println("mappings getSourceAsMap--  "+metadata.mappings().getSourceAsMap());
            System.out.println("mappings type-- "+metadata.mappings().type());
            System.out.println("mappings routing-- "+metadata.mappings().routing());
            System.out.println("settings  "+metadata.settings());
            System.out.println("order  "+metadata.order());
            System.out.println("patterns  "+metadata.patterns());


        }
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>  ");
    }

2.4 模板是否存在

   public static void indexTemplateExist(String templateName) throws IOException {
        IndexTemplatesExistRequest request = new IndexTemplatesExistRequest(templateName);

        boolean exists = ES_CLIENT.indices().existsTemplate(request, RequestOptions.DEFAULT);
        System.out.println("模板是否存在:" + exists );
    }

3.索引,索引别名

3.1创建索引,同时创建索引别名

  public static void createIndex(String indexName) throws IOException {
        // 1.创建索引名
        CreateIndexRequest request = new CreateIndexRequest(indexName);
      
        CreateIndexResponse response = ES_CLIENT.indices().create(request, RequestOptions.DEFAULT);

        //返回响应是否得到确认 返回:如果响应已确认,则为 true,否则为 false。
        System.out.println("创建索引 response:" + response.isAcknowledged());
        //如果在从索引创建操作返回之前启动了所需数量的分片,则返回 true。如果 isAcfirmd() 为 false,则这也返回 false。
        System.out.println("创建索引 response:" + response.isShardsAcknowledged());
    }

3.2 删除索引

//deleteIndex 索引名
public static void deleteIndex(String... deleteIndex) throws IOException {
    // 1.创建索引名
    DeleteIndexRequest request = new DeleteIndexRequest(deleteIndex);

    AcknowledgedResponse response = ES_CLIENT.indices().delete(request, RequestOptions.DEFAULT);


    //返回响应是否得到确认 返回:如果响应已确认,则为 true,否则为 false。
    System.out.println("删除索引 response:" + response.isAcknowledged());
}

3.3 向索引写入数据

//   indexAlias 别名
public static void wirteIndex(String indexAlias) throws IOException {
        IndexRequest request = new IndexRequest(indexAlias, "_doc");
        // 2、准备文档数据
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("id", LocalDateTime.now());
        request.source(jsonMap, XContentType.JSON);
        // .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
        //3、发送请求    同步方式
        IndexResponse indexResponse = ES_CLIENT.index(request, RequestOptions.DEFAULT);

        System.out.println("添加数据 indexResponse:" + indexResponse);
        System.out.println("添加数据 "+indexResponse.status());
    }



//    /**
//     * 默认,不刷新
//     * 不消耗资源
//     * 连续操作容易导致数据不同步
//     */
//    NONE("false"),
//    /**
//     * 强制刷新,立即刷新数据,刷新成功后结束
//     * 保证最终数据同步
//     * 耗资源
//     */
//    IMMEDIATE("true"),
//    /**
//     * 延迟刷新数据,刷新成功后结束
//     * 保证最终数据同步
//     * 耗时(根据refresh_interval配置决定等待时间
//     */
//    WAIT_UNTIL("wait_for");

3.4 根据索引别名查询

    public static void indexAliasSearch(String indexAlias) throws IOException {
        //查询索引
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().query(new BoolQueryBuilder());
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices(indexAlias).source(searchSourceBuilder);
        System.out.println(searchSourceBuilder.toString());
        SearchResponse resp = ES_CLIENT.search(searchRequest, RequestOptions.DEFAULT);

        //打印结果信息
        SearchHits hits = resp.getHits();
        System.out.println("查询结果  "+hits.getHits().length);
        System.out.println("查询结果  "+resp.getSuccessfulShards());
        System.out.println("查询结果  "+resp.getClusters().toString());


        //关闭ES客户端
        ES_CLIENT.close();
    }

3.5删除索引别名


   public static void main(String[] args) throws IOException {

        DeleteAliasRequest deleteAliasRequest = new DeleteAliasRequest("test-index-100001","test-index-alias");
        ES_CLIENT.indices().deleteAlias(deleteAliasRequest, RequestOptions.DEFAULT);
        // 6.关闭 client
        ES_CLIENT.close();
    }

4.滚动索引

 public static void main(String[] args) throws Exception {
        //写索引别名
        String  writeIndexAlias ="test-index-alias-write";
        //读索引别名
        String  readIndexAlias ="test-index-alias-read";
        createRollover(writeIndexAlias,readIndexAlias);
    }

    public static void createRollover(String writeIndexAlias,String readIndexAlias) throws IOException {
        //指向要翻转的索引的别名(第一个参数),以及执行翻转操作时新索引的名称。新的索引参数是可选的,可以设置为 null
        RolloverRequest request = new RolloverRequest(writeIndexAlias, null);
        //request.addMaxIndexAgeCondition(new TimeValue(1, TimeUnit.SECONDS));        //指数年龄的条件
        request.addMaxIndexDocsCondition(4); //索引中文档数量的条件
        request.addMaxIndexSizeCondition(new ByteSizeValue(1, ByteSizeUnit.GB));  //索引大小的条件
        //todo添加索引映射 
        CreateIndexRequest createIndexRequest = request.getCreateIndexRequest();
        //createIndexRequest.mapping(); //添加索引映射 
        //request.dryRun(true);
        //request.setTimeout(TimeValue.timeValueMinutes(2));
        //request.setMasterTimeout(TimeValue.timeValueMinutes(1));
        //request.getCreateIndexRequest().waitForActiveShards(ActiveShardCount.from(2));
        // request.getCreateIndexRequest().waitForActiveShards(ActiveShardCount.DEFAULT);


        request.getCreateIndexRequest().alias(new Alias(readIndexAlias));

        RolloverResponse rollover = ES_CLIENT.indices().rollover(request, RequestOptions.DEFAULT);
        System.out.println("滚动索引=======================");
        Map<String, Boolean> status = rollover.getConditionStatus();
        System.out.println(status);
        String newIndex = rollover.getNewIndex();
        System.out.println("newIndex  " + newIndex);
        String oldIndex = rollover.getOldIndex();
        System.out.println("oldIndex  " + oldIndex);

        System.out.println("设置滚动索引成功!");
        System.out.println("isRolledOver:" + rollover.isRolledOver());
        System.out.println("isDryRun:" + rollover.isDryRun());
        System.out.println("acknowledged:" + rollover.isAcknowledged());
        System.out.println("shardsAcked:" + rollover.isShardsAcknowledged());
        System.out.println("===============================");



    }

5. 测试

public class MainTest {

    public static void main(String[] args) throws Exception {
        //模板名
        String  templateName ="my-template";
        //模板别名
        String  templateAliases ="my-template-alias";
        //滚动索引范围
        List<String> patterns = Arrays.asList("test-index-*");

        //索引名后几位是数组 如果是1会称为000001 逐渐递增
        String  indexName ="test-index-100000";
        //写索引别名
        String  writeIndexAlias ="test-index-alias-write";
        //读索引别名
        String  readIndexAlias ="test-index-alias-read";
        //
        //deleteTemplate(templateName);
        // deleteIndex(indexName);

        //todo 模板是否存在
        indexTemplateExist(templateName);
        //创建模板
        createTemplate(templateName,templateAliases,patterns);
        //查询模板
        queryTemplate(templateName);


        //使用模板创建索引
        createIndex(indexName);
        //给索引加别名
        createAlias(indexName,writeIndexAlias,readIndexAlias);

      createRollover(writeIndexAlias,readIndexAlias);

        for (int i = 0; i <3 ; i++) {
            //向索引写入数据
            wirteIndex(writeIndexAlias);
        }
        for (int i = 0; i <4 ; i++) {
            wirteIndex(writeIndexAlias);
        }

        //触发滚动条件
        createRollover(writeIndexAlias,readIndexAlias);

        //查询索引情况
        indexAliasSearch(readIndexAlias);

    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值