mongoutil,esutil

package com.logapi.monitor.common.util;

import com.logapi.monitor.common.pojo.PageParam;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.*;
import com.mongodb.client.model.Sorts;
import com.sun.org.apache.bcel.internal.generic.NEW;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class MongoUtil {



    @Autowired
    private MongoClient mongoClient;

    @Autowired
    private MongoConverter mongoConverter;

    /**
     * 獲取database
     *
     * @return
     * @paramdbName
     */
    public MongoDatabase getDB(String dbName) {
        if (dbName != null && !"".equals(dbName)) {
            MongoDatabase database = mongoClient.getDatabase(dbName);
            return database;
        }
        return null;
    }

    /**
    * @author: ganchao
    * @description: 單條數據插入
    * @date: 2019/9/2 8:43
    * @param: [dbName, collectionName, document]
    * @return: void
    */
    public void insert(String dbName, String collectionName,Document document){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        collection.insertOne(document);
    }

    /**
    * @author: ganchao
    * @description: list數據插入
    * @date: 2019/9/2 8:43
    * @param: [dbName, collectionName, documents]
    * @return: void
    */
    public void insertList(String dbName, String collectionName,List<Document> documents){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        collection.insertMany(documents);
    }

    /**    
    * @author: ganchao 
    * @description: 刪除單條數據
    * @date: 2019/9/2 8:49  
    * @param: [dbName, collectionName, basicDBObject]  
    * @return: void  
    */
    public void deleteOne(String dbName, String collectionName,Bson basicDBObject){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        //collection.findOneAndDelete(basicDBObject); //刪除一條
        collection.deleteOne(basicDBObject);
    }

    /**
    * @author: ganchao
    * @description: 刪除多條數據
    * @date: 2019/9/2 8:50
    * @param: [dbName, collectionName, basicDBObject]
    * @return: void
    */
    public void deleteMany(String dbName, String collectionName,Bson basicDBObject){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        collection.deleteMany(basicDBObject);
    }

    /**
    * @author: ganchao
    * @description: 更新單條數據
    * @date: 2019/9/2 8:50
    * @param: [dbName, collectionName, query, updateObject]
    * @return: void
    */
    public void update(String dbName, String collectionName,BasicDBObject query,Bson updateObject){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        //更新一條數據
        collection.updateOne(query,updateObject);

    }

    /**
    * @author: ganchao
    * @description: 更新多條數據
    * @date: 2019/9/2 8:50
    * @param: [dbName, collectionName, query, updateObject]
    * @return: void
    */
    public void updateMany(String dbName, String collectionName,BasicDBObject query,Bson updateObject){
        MongoCollection<Document> collection = getDB(dbName).getCollection(collectionName);
        //更新多條數據
        collection.updateMany(query, updateObject);
    }

    /**
     * 條件查詢記錄數量
     *
     * @return
     * @paramcollection
     * @paramfilter
     */
    public Long count(String dbName, String collectionName, BasicDBObject query) {
        Long count = 0L;
        if (query == null) {
            query = new BasicDBObject();
        }
        if (null == collectionName || "".equals(collectionName)) {
            return null;
        }
        if (null == dbName || "".equals(dbName)) {
            return null;
        }
        MongoDatabase database = getDB(dbName);
        if (database != null) {
            MongoCollection<Document> collection = database.getCollection(collectionName);
            try {
                //構建查詢條件
                count = collection.count(query);
            } finally {
            }
        } else {
            return null;
        }

        return count;
    }

    /**
     * 條件查詢
     *
     * @return
     * @paramcollection
     * @paramfilter
     */
    public <T> List<T> find(String dbName, String collectionName, Class<T> clazz, BasicDBObject query, Bson sort, PageParam page, String[] fields) {
        if (query == null) {
            query = new BasicDBObject();
        }
        List<T> list = new ArrayList<T>();
        MongoCursor<Document> cursor = null;
        if (null == collectionName || "".equals(collectionName)) {
            return null;
        }
        if (null == dbName || "".equals(dbName)) {
            return null;
        }
        MongoDatabase database = getDB(dbName);
        if (database != null) {
            MongoCollection<Document> collection = database.getCollection(collectionName);
            try {
                //構建查詢條件
                FindIterable<Document> iterable = collection.find(query);
                iterable = addField(iterable,fields);
                iterable = addSort(iterable,sort);
                iterable = addPageInfo(iterable,page);
                cursor = iterable.iterator();
                while (cursor.hasNext()) {
                    Document document = cursor.next();
                    T t = mongoConverter.read(clazz, document);
                    list.add(t);
                }
            } finally {
                if (cursor != null) {
                    cursor.close();
                }

            }
        } else {
            return null;
        }

        return list;
    }

    private FindIterable<Document> addField(FindIterable<Document> document, String[] fields) {
        if (fields == null || fields.length <= 0) {
            return document;
        }
        BasicDBObject basicDBObject = new BasicDBObject();
        for (String field : fields) {
            basicDBObject.append(field, 1);
        }
        return document.projection(basicDBObject);
    }

    private FindIterable<Document> addSort(FindIterable<Document> document, Bson orderBy) {
        if (orderBy == null) {
            return document;
        }
        return document.sort(orderBy);
    }

    private FindIterable<Document> addPageInfo(FindIterable<Document> document, PageParam page) {
        if (page == null) {
            return document;
        }
        return document.skip((page.getPageNo() - 1) * page.getPageSize()).limit(page.getPageSize());
    }



   /* public MongoCursor<Document> findByPage(MongoCollection<Document> collection, Bson filter, int pageNo, int pageSize) {
        Bson orderBy = new BasicDBObject("_id", 1);
        Bson times = Sorts.orderBy(Sorts.descending("times"));
        return collection.find(filter).sort(orderBy).skip((pageNo - 1) * pageSize).limit(pageSize).iterator();
    }*/

    public void createIndex(String dbName, String collectionName,Bson bson) {
        MongoDatabase database = getDB(dbName);
        MongoCollection<Document> collection = database.getCollection(collectionName);
        collection.createIndex(bson);
    }

    public List<Document> listIndex(String dbName, String collectionName) {
        List<Document> list = new ArrayList<Document>() { };
        MongoDatabase database = getDB(dbName);
        MongoCollection<Document> collection = database.getCollection(collectionName);
        ListIndexesIterable<Document> documents = collection.listIndexes();
        MongoCursor<Document> iterator = documents.iterator();
        while (iterator.hasNext()) {
            Document document = iterator.next();
            list.add(document);
        }
        return list;

    }


    

}

 

package com.logapi.monitor.common.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.logapi.monitor.api.hbankcurrenttrade.pojo.document.LogInfo;
import com.logapi.monitor.common.pojo.EsPage;
import com.logapi.monitor.common.pojo.PageESResult;
import com.logapi.monitor.common.pojo.PageResult;
import com.logapi.monitor.common.pojo.SortingField;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.ParseException;
import org.apache.http.entity.ContentType;
import org.apache.http.nio.entity.NStringEntity;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.common.xcontent.json.JsonXContent;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @Title: ElasticsearchUtil
 * @Description: 工具類
 */
public class ElasticSearchRestClientUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchRestClientUtil.class);

  //  @Resource(name = "restHighLevelClient")
  //  private RestHighLevelClient restHighLevelClient;

    //private static RestHighLevelClient client;
    private static String shards = "6";
    private static String replicas = "1";

    private static ObjectMapper mapper = new ObjectMapper();


    /**
     * 創建索引
     *
     * @return
     */
   /* public static boolean createIndex(RestHighLevelClient client,String index) {
        //index名必須全小寫,否則報錯
        CreateIndexRequest request = new CreateIndexRequest(index);
        try {
            CreateIndexResponse indexResponse = client.indices().create(request,RequestOptions.DEFAULT);
            if (indexResponse.isAcknowledged()) {
                LOGGER.info("創建索引成功");
            } else {
                LOGGER.info("創建索引失敗");
            }
            return indexResponse.isAcknowledged();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return false;
    }*/
    public static boolean createIndex(RestHighLevelClient client,String indexName, String type, XContentBuilder builders) {
        if (indexExists(client,indexName)) {
            return true;
        }
        try {
            CreateIndexRequest index = new CreateIndexRequest(indexName);
            XContentBuilder builder = JsonXContent.contentBuilder();
            builder.startObject()
                    .startObject("settings")
                    .field("number_of_shards", Integer.parseInt(shards))
                    .field("number_of_replicas", Integer.parseInt(replicas))
                    .endObject()
                    .endObject();
            index.source(builder).mapping(type, builders);
            CreateIndexResponse response = client.indices().create(index, RequestOptions.DEFAULT);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 查詢索引是否存在
     */
    public static boolean indexExists(RestHighLevelClient client,String indexName) {
        GetIndexRequest request = new GetIndexRequest();
        request.indices(indexName);
        try {
            return client.indices().exists(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 插入數據
     *
     * @param index
     * @param type
     * @param object
     * @return
     */
    public static String addData(RestHighLevelClient client,String index, String type, String id, JSONObject object) {
        IndexRequest indexRequest = new IndexRequest(index, type, id);
        try {
            indexRequest.source(mapper.writeValueAsString(object), XContentType.JSON);
            IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT);
            return indexResponse.getId();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 檢查索引
     *
     * @param index
     * @return
     * @throws IOException
     */
    public static boolean checkIndexExist(RestHighLevelClient client,String index) {
        GetIndexRequest request = new GetIndexRequest();
        request.indices(index);
        try {
            return client.indices().exists(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 獲取低水平客戶端
     * RestHighLevelClient還不完善,還需要增加新API,但是RestLowLevelClient非常完善,滿足我們的API需求
     *
     * @return
     */
    public static RestClient getLowLevelClient(RestHighLevelClient client) {
        return client.getLowLevelClient();
    }


    /**
     * 使用分詞查詢,並分頁
     *
     * @param index          索引名稱
     * @param startPage      當前頁
     * @param pageSize       每頁顯示條數
     * @param query          查詢條件
     * @param fields         需要顯示的字段,逗號分隔(缺省爲全部字段)
     * @param sortField      排序字段
     * @param highlightField 高亮字段
     * @return
     */
    public static EsPage searchDataPage(RestHighLevelClient client, String index, int startPage, int pageSize, QueryBuilder query, String fields, String sortField, String highlightField, SortOrder sort) {

        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
       /* if (StringUtils.isNotEmpty(type)) {
            searchRequestBuilder.setTypes(type.split(","));
            sourceBuilder.
        }*/
        // searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);

        // 需要顯示的字段,逗號分隔(缺省爲全部字段)
        if (StringUtils.isNotEmpty(fields)) {
            // searchRequestBuilder.setFetchSource(fields.split(","), null);
            sourceBuilder.fetchSource(fields.split(","), null);
        }

        //排序字段
        if (StringUtils.isNotEmpty(sortField)) {
            // searchRequestBuilder.addSort(sortField, SortOrder.DESC);
            if (sortField.contains(",")){
                for (String name : sortField.split(",")){
                    sourceBuilder.sort(name, sort);
                }
            }else {
                sourceBuilder.sort(sortField, sort);
            }
        }
        // 高亮(xxx=111,aaa=222)
        if (StringUtils.isNotEmpty(highlightField)) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();

            //highlightBuilder.preTags("<span style='color:red' >");//設置前綴
            //highlightBuilder.postTags("</span>");//設置後綴

            // 設置高亮字段
            highlightBuilder.preTags("<h2>");
            highlightBuilder.postTags("</h2>");
            String[] highlightFields = highlightField.split(",");
            for (String f : highlightFields) {
                highlightBuilder.field(f);
            }
            //searchRequestBuilder.highlighter(highlightBuilder);
            sourceBuilder.highlighter(highlightBuilder);
        }

        // 分頁應用
        //  searchRequestBuilder.setFrom(startPage).setSize(pageSize);
        sourceBuilder.from(startPage * pageSize).size(pageSize);
        // 設置是否按查詢匹配度排序
        // searchRequestBuilder.setExplain(true);
        sourceBuilder.explain(true);

        //打印的內容 可以在 Elasticsearch head 和 Kibana  上執行查詢
        // LOGGER.info("\n{}", sourceBuilder);

        // 執行搜索,返回搜索響應信息
        //SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();


        sourceBuilder.query(query);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage(), e);
            return null;
        }

        long totalHits = searchResponse.getHits().totalHits;
        long length = searchResponse.getHits().getHits().length;

        LOGGER.debug("共查詢到[{}]條數據,處理數據條數[{}]", totalHits, length);

        if (searchResponse.status().getStatus() == 200) {
            // 解析對象
            List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);

            return new EsPage(startPage, pageSize, (int) totalHits, sourceList);
        }

        return null;

    }

    /**
     * 使用分詞查詢,並分頁
     *
     * @param index          索引名稱
     * @param startPage      當前頁
     * @param pageSize       每頁顯示條數
     * @param query          查詢條件
     * @param fields         需要顯示的字段,逗號分隔(缺省爲全部字段)
     * @param highlightField 高亮字段
     * @return
     */
    public static EsPage searchDataPage(RestHighLevelClient client, String index, int startPage, int pageSize, QueryBuilder query, String fields, String highlightField, List<SortingField> sort) {

        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        //SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
       /* if (StringUtils.isNotEmpty(type)) {
            searchRequestBuilder.setTypes(type.split(","));
            sourceBuilder.
        }*/
        // searchRequestBuilder.setSearchType(SearchType.QUERY_THEN_FETCH);

        // 需要顯示的字段,逗號分隔(缺省爲全部字段)
        if (StringUtils.isNotEmpty(fields)) {
            // searchRequestBuilder.setFetchSource(fields.split(","), null);
            sourceBuilder.fetchSource(fields.split(","), null);
        }

        //排序字段
        if (sort !=null && sort.size() >0) {
            // searchRequestBuilder.addSort(sortField, SortOrder.DESC);
            for (SortingField sortField : sort) {
                sourceBuilder.sort(sortField.getField(), sortField.getSortOrder());
            }
        }
        // 高亮(xxx=111,aaa=222)
        if (StringUtils.isNotEmpty(highlightField)) {
            HighlightBuilder highlightBuilder = new HighlightBuilder();

            //highlightBuilder.preTags("<span style='color:red' >");//設置前綴
            //highlightBuilder.postTags("</span>");//設置後綴

            // 設置高亮字段
            highlightBuilder.preTags("<h2>");
            highlightBuilder.postTags("</h2>");
            String[] highlightFields = highlightField.split(",");
            for (String f : highlightFields) {
                highlightBuilder.field(f);
            }
            //searchRequestBuilder.highlighter(highlightBuilder);
            sourceBuilder.highlighter(highlightBuilder);
        }

        // 分頁應用
        //  searchRequestBuilder.setFrom(startPage).setSize(pageSize);
        sourceBuilder.from(startPage * pageSize).size(pageSize);
        // 設置是否按查詢匹配度排序
        // searchRequestBuilder.setExplain(true);
        sourceBuilder.explain(true);

        //打印的內容 可以在 Elasticsearch head 和 Kibana  上執行查詢
        // LOGGER.info("\n{}", sourceBuilder);

        // 執行搜索,返回搜索響應信息
        //SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();


        sourceBuilder.query(query);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage(), e);
            return null;
        }

        long totalHits = searchResponse.getHits().totalHits;
        long length = searchResponse.getHits().getHits().length;

        LOGGER.debug("共查詢到[{}]條數據,處理數據條數[{}]", totalHits, length);

        if (searchResponse.status().getStatus() == 200) {
            // 解析對象
            List<Map<String, Object>> sourceList = setSearchResponse(searchResponse, highlightField);

            return new EsPage(startPage, pageSize, (int) totalHits, sourceList);
        }

        return null;

    }

    /**
     * 高亮結果集 特殊處理
     *
     * @param searchResponse
     * @param highlightField
     */
    private static List<Map<String, Object>> setSearchResponse(SearchResponse searchResponse, String highlightField) {
        List<Map<String, Object>> sourceList = new ArrayList<Map<String, Object>>();


        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            searchHit.getSourceAsMap().put("id", searchHit.getId());

            if (StringUtils.isNotEmpty(highlightField)) {

                // System.out.println("遍歷 高亮結果集,覆蓋 正常結果集" + searchHit.getSourceAsMap());
                String[] highlightFields = highlightField.split(",");
                for (String f : highlightFields) {
                    StringBuffer stringBuffer = new StringBuffer();
                    Text[] text = null;
                    if (searchHit.getHighlightFields() != null && searchHit.getHighlightFields().get(f) != null) {
                        text = searchHit.getHighlightFields().get(f).getFragments();
                    }

                    if (text != null) {
                        for (Text str : text) {
                            stringBuffer.append(str.string());
                        }
                        //遍歷 高亮結果集,覆蓋 正常結果集
                        searchHit.getSourceAsMap().put(f, stringBuffer.toString());
                    }
                }

            }
            sourceList.add(searchHit.getSourceAsMap());
        }

        return sourceList;
    }


    /**
     * 使用分詞查詢(返回數量)
     *
     * @param index 索引名稱
     * @param query 查詢條件
     * @return
     */
    public <T> Long searchCount(RestHighLevelClient client,String index, QueryBuilder query) {
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(query);

        sourceBuilder.fetchSource(true);

        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage(), e);
            return null;
        }

        if (searchResponse.status().getStatus() == 200) {
            // 解析對象
            return searchResponse.getHits().getTotalHits();
        }

        return null;

    }

    /**
     * 使用分詞查詢(返回實體list)
     *
     * @param index     索引名稱
     * @param query     查詢條件
     * @param size      文檔大小限制
     * @param fields    需要顯示的字段,逗號分隔(缺省爲全部字段)
     * @param sortField 排序字段
     * @return
     */
    public static  <T> PageESResult<T> searchListBeanData(RestHighLevelClient client, String index, QueryBuilder query, Class<T> entityClass, Integer page, Integer size, String fields, String sortField, SortOrder sort) {

        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        sourceBuilder.query(query);
        if (StringUtils.isNotEmpty(fields)) {
            sourceBuilder.fetchSource(fields.split(","), null);
        }
        sourceBuilder.fetchSource(true);

        if (StringUtils.isNotEmpty(sortField) && sort != null) {
            sourceBuilder.sort(sortField, sort);
        }

        if (size != null && size > 0) {
            sourceBuilder.from(page * size).size(size);
        }
        sourceBuilder.explain(true);

        sourceBuilder.query(query);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);


        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage(), e);
            return null;
        }

        if (searchResponse.status().getStatus() == 200) {
            // 解析對象
            return setSearchResponse2(searchResponse, entityClass);
        }

        return null;

    }

    /**
     * 使用分詞查詢(返回實體list)
     *
     * @param index     索引名稱
     * @param query     查詢條件
     * @param size      文檔大小限制
     * @param fields    需要顯示的字段,逗號分隔(缺省爲全部字段)
     * @return
     */
    public static  <T> PageESResult<T> searchListBeanData(RestHighLevelClient client, String index, QueryBuilder query, Class<T> entityClass, Integer page, Integer size, String fields,List<SortingField> sort) {

        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

        sourceBuilder.query(query);
        if (StringUtils.isNotEmpty(fields)) {
            sourceBuilder.fetchSource(fields.split(","), null);
        }
        sourceBuilder.fetchSource(true);

        if (sort !=null && sort.size() >0) {
            // searchRequestBuilder.addSort(sortField, SortOrder.DESC);
            for (SortingField sortField : sort) {
                sourceBuilder.sort(sortField.getField(), sortField.getSortOrder());
            }
        }

        if (size != null && size > 0) {
            sourceBuilder.from(page * size).size(size);
        }
        sourceBuilder.explain(true);

        sourceBuilder.query(query);
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        searchRequest.source(sourceBuilder);


        SearchResponse searchResponse = null;
        try {
            searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.error(e.getMessage(), e);
            return null;
        }

        if (searchResponse.status().getStatus() == 200) {
            // 解析對象
            return setSearchResponse2(searchResponse, entityClass);
        }

        return null;

    }


    /**
     * @param searchResponse
     */
    private static <T> List<T> setSearchResponse(SearchResponse searchResponse, Class<T> entityClass) {
        List<Map> sourceList = new ArrayList<Map>();

        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            searchHit.getSourceAsMap().put("id", searchHit.getId());
            sourceList.add(searchHit.getSourceAsMap());
        }

        return convertMapListToBeanList(sourceList, entityClass);
    }

    private static <T> PageESResult<T> setSearchResponse2(SearchResponse searchResponse, Class<T> entityClass) {
        PageESResult<T> pageResult = new PageESResult<T>();
        pageResult.setTotal(0L);
        List<T> sourceList = new ArrayList<T>();
        long l = System.currentTimeMillis();
        for (SearchHit searchHit : searchResponse.getHits().getHits()) {
            try {
                //T obj = entityClass.newInstance();//創建bean的實例對象
                String sourceAsString = searchHit.getSourceAsString();
                JSONObject jsonObject = JSONObject.parseObject(sourceAsString);
                T t = JSONObject.toJavaObject(jsonObject, entityClass);
                sourceList.add(t);
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
        pageResult.setList(sourceList);
        pageResult.setTotal(searchResponse.getHits().getTotalHits());
        return pageResult;
    }

    /**
     * 將一個map組成的list轉成實體類bean組成的list
     *
     * @param mapList 存了map對象的list
     * @param clazz   需要將這些map轉成哪個實體類對象
     * @return
     */
    public static <T> List<T> convertMapListToBeanList(List<Map> mapList, Class<T> clazz) {
        List<T> list = new ArrayList<T>();
        for (Map map : mapList) {
            try {
                T obj = clazz.newInstance();//創建bean的實例對象
                for (Object o : map.keySet()) {//遍歷map的key
                    for (Method m : clazz.getMethods()) {//遍歷bean的類中的方法,找到set方法進行賦值
                        if (m.getName().toLowerCase().equals("set" + o.toString().toLowerCase())) {
                            m.invoke(obj, map.get(o));
                        }
                    }
                }
                list.add(obj);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

    public static List<String> getAnalyze(RestHighLevelClient client,String text) {
        List<String> list = new ArrayList<String>();
        text = text.length() > 100 ? text.substring(0, 100) : text;
        Map<String, String> params = new HashMap<>();
        params.put("analyzer", "standard");
        params.put("text", text);

        //方式3:提供謂詞和終節點以及可選查詢字符串參數和org.apache.http.HttpEntity對象中包含的請求主體來發送請求
        params = Collections.emptyMap();
        String jsonString = "{" +
                "\"analyzer\":\"standard\"," +
                "\"text\":\""+text+"\"}";
        //爲HttpEntity指定ContentType非常重要,因爲它將用於設置Content-Type請求頭,以便Elasticsearch可以正確解析內容。
        HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON);

        try {
            Response response = client.getLowLevelClient().performRequest("GET", "_analyze",Collections.emptyMap(),entity);
            JSONObject tokens = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
            JSONArray arrays = tokens.getJSONArray("tokens");
            for (int i = 0; i < arrays.size(); i++)
            {
                JSONObject obj = JSON.parseObject(arrays.getString(i));
                list.add(obj.getString("token"));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }

  /*  public void getIkAnalyzeSearchTerms(String searchContent) {
        AnalyzeRequest analyzeRequest = new AnalyzeRequest("kb.area").text(searchContent).analyzer("standard");
        List<AnalyzeResponse.AnalyzeToken> tokens = client.admin().indices().analyze(analyzeRequest).actionGet().getTokens();
        client.getLowLevelClient().performRequest()
        for (AnalyzeResponse.AnalyzeToken token : tokens) {
            System.out.println(token.getTerm());
        }
    }*/


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章