2016-07-27 1 views
1

検索結果に応じて特定のデータを削除しようとしています。私はelasticsearchバージョン2.3と組み込みサーバーを使用しています。私は以下のようにスタンドアロンサーバーでクエリを削除するプラグインでこれを行うことに成功しましたが、組み込みサーバーでプラグインを使用できないようです。Java API Elasticsearchを使用してクエリに関連するデータ結果を削除する

DeleteByQueryResponse delete = new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE) 
    .setIndices(ES_INDEX_NAME) 
    .setTypes(ES_RECORD_TYPE) 
    .setQuery(QueryBuilders.boolQuery() 
      .filter(QueryBuilders.termQuery(ENTITY_ID, entityId))) 
    .execute().actionGet(); 

V2.3に埋め込まれたサーバと、削除・バイ・クエリプラグインを使用する方法はありますか?一致基準に従ってデータを削除するにはどうしたらいいですか?

ご協力いただければ幸いです。

+0

これを達成するための方法は、この問題で説明されていますhttps://github.com/elastic/elasticsearch/issues/19197 – Val

+0

@val:ありがとうございますが、それはのように推奨される方法ではないようですES 2.xはプラグインの追加を防ぐために "plugin.types"と.addPlugin()を削除します。 –

+0

あなたはそのチケットの2つのリンクされた問題を閲覧しましたか? – Val

答えて

1

私はelasticsearchの以前のバージョンの解決策hereを見つけました。 私の解決策はここにあります。

public void resetStatistics(String entityId) { 
    if (client.admin().indices().exists(new IndicesExistsRequest(ES_INDEX_NAME)).actionGet().isExists()) { 
     BulkRequestBuilder bulkRequest = client.prepareBulk(); 

     try { 
      logger.info("Elasticsearch cleaning task execution started"); 

      SearchResponse scrollResp = client.prepareSearch(ES_INDEX_NAME) 
        .setTypes(ES_RECORD_TYPE) 
        .setScroll(TIME_VALUE) 
        .setQuery(
          QueryBuilders.boolQuery() 
            .filter(QueryBuilders.termQuery(ENTITY_ID, entityId))) 
        .addSort("_doc", SortOrder.ASC) 
        .setNoFields() 
        .setSize(100).execute().actionGet(); 

      while (true) { 
       for (SearchHit hit : scrollResp.getHits().getHits()) { 
        bulkRequest.add(client.prepareDelete() 
          .setIndex(ES_INDEX_NAME) 
          .setType(ES_RECORD_TYPE) 
          .setId(hit.getId())); 
       } 
       scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(TIME_VALUE).execute().actionGet(); 

       if (scrollResp.getHits().getHits().length == 0) { 
        break; 
       } 
      } 

      if (!bulkRequest.request().requests().isEmpty()) { 
       BulkResponse bulkResponse = bulkRequest.execute().actionGet(); 
       if (bulkResponse.hasFailures()) { 
        logger.error("Elasticsearch cleaning task execution failed"); 
       } else { 
        logger.info("Elasticsearch cleaning task finished execution deleting {} documents", bulkResponse.getItems().length); 
       } 
      } else { 
       logger.info("Elasticsearch cleaning task finished execution without deleting any documents"); 
      } 
     } catch (Exception e) { 
      logger.error("Unable to delete data", e); 
     } 

     try { 
      logger.info("Elasticsearch index optimization started"); 

      ForceMergeResponse forceMergeResponse = client.admin().indices() 
        .prepareForceMerge(ES_INDEX_NAME) 
        .setFlush(true) 
        .setOnlyExpungeDeletes(false) 
        .execute().actionGet(); 

      logger.info("Elasticsearch index optimization finished with {} successful and {} failed shards out of " + 
        "{} total shards", forceMergeResponse.getSuccessfulShards(), forceMergeResponse.getFailedShards(), 
        forceMergeResponse.getTotalShards()); 
     } catch (Exception e) { 
      logger.error("Error while optimizing Elasticsearch index", e); 
     } 
    } 
} 
関連する問題