package com.shentu.dht.util;


import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeRequest;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse;
import org.elasticsearch.action.admin.indices.close.CloseIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.open.OpenIndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * Created by styb on 2019/3/28.
 */
public class Test {
    private  static RestHighLevelClient client=null;
    public static void main(String[] args) throws Exception{
         client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("39.98.247.199", 9200, "http")));
//        openIndex();
//        createIndex();
//            index(null);
        anylyze();
//        createIndex();
//        index(null);
//        search(null);
    }

    public static void index(Map<String, Object> m) throws Exception{
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("message", "我是真的好气哦是真的");
        IndexRequest indexRequest = new IndexRequest("twitter", "_doc", "1").opType("create")
                .source(jsonMap);
        client.index(indexRequest, RequestOptions.DEFAULT);
    }

    public static void createIndex() throws Exception{
        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        {
            builder.startObject("properties");
            {
                builder.startObject("message");
                {
                    builder.field("type", "text");
                    builder.field("analyzer", "ik_max_word");
                    builder.field("search_analyzer", "ik_max_word");

                }
                builder.endObject();
            }
            builder.endObject();
        }
        builder.endObject();
        CreateIndexRequest request = new CreateIndexRequest("twitter");
        request.mapping(builder);
        client.indices().create(request, RequestOptions.DEFAULT);

    }

    public static void get(Map<String, Object> m) throws Exception{
        GetRequest getRequest = new GetRequest(
                "haha",
                "doc",
                "2");
        String[] includes = new String[]{"message","user","*Date"};
        String[] excludes = Strings.EMPTY_ARRAY;
        FetchSourceContext fetchSourceContext =
                new FetchSourceContext(true, includes, excludes);
        getRequest.fetchSourceContext(fetchSourceContext);

        GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
        String index = getResponse.getIndex();
        String type = getResponse.getType();
        String id = getResponse.getId();
        if (getResponse.isExists()) {
            long version = getResponse.getVersion();
            String sourceAsString = getResponse.getSourceAsString();
            Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
            System.out.println(sourceAsMap);
        } else {

        }
    }

    public static void search(Map<String, Object> m) throws Exception{

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(5);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.query(QueryBuilders.termQuery("message", "视频"));

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("torrent");
        searchRequest.source(searchSourceBuilder);


        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        RestStatus status = searchResponse.status();
        TimeValue took = searchResponse.getTook();
        Boolean terminatedEarly = searchResponse.isTerminatedEarly();
        boolean timedOut = searchResponse.isTimedOut();
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            // do something with the SearchHit
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            System.out.print(sourceAsMap+"===");
        }


    }

    public static void closeIndex() throws Exception{
        CloseIndexRequest request = new CloseIndexRequest("haha");

        AcknowledgedResponse closeIndexResponse = client.indices().close(request, RequestOptions.DEFAULT);
        System.out.println(closeIndexResponse.isAcknowledged());
    }

    public static void openIndex() throws Exception{
        OpenIndexRequest request = new OpenIndexRequest("haha");

        AcknowledgedResponse closeIndexResponse = client.indices().open(request, RequestOptions.DEFAULT);
        System.out.println(closeIndexResponse.isAcknowledged());
    }

    public static void anylyze() throws Exception{
        AnalyzeRequest request = new AnalyzeRequest();
        request.text("ReadMe.txt Screenshots,ReadMe.txt Screenshots,1.jpg COVER.jpg Screenshots,4.jpg Screenshots,2.jpg Screenshots,3.jpg FIFA.Street.2012 - RELOADED.rar");
        request.analyzer("ik_max_word");

        AnalyzeResponse response = client.indices().analyze(request, RequestOptions.DEFAULT);
        List<AnalyzeResponse.AnalyzeToken> tokens =
                response.getTokens();
        for(AnalyzeResponse.AnalyzeToken to:tokens){
            System.out.println(to.getTerm());
        }
        System.out.println(response.getTokens().get(0).getAttributes());
    }

    public static void deleteIndex() throws Exception{
        DeleteIndexRequest request = new DeleteIndexRequest("torrent");
        AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(deleteIndexResponse.isAcknowledged());
    }


}