elasticsearch-java版本实例,连接池、增、删、改、查

1.es-java连接池

import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.client.http.JestHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.LinkedHashSet;

/**
 * Author:me
 * Date:2018/12/21
 */
@Component
public class ESFactory {

    private static JestHttpClient client;

    private static final LinkedHashSet servers = new LinkedHashSet();
	//es节点   ip:port,ip:port......
    @Value("${es.conn}")
    private String esConn;

    @PostConstruct
    public void init() {
        if (client == null) {
            Collections.addAll(servers, esConn.split(","));
        }
    }

    public JestHttpClient getClient() {
        try {
            if (client == null) {
                synchronized (ESFactory.class) {
                    if (client == null) {
                        JestClientFactory factory = new JestClientFactory();
                        factory.setHttpClientConfig(new HttpClientConfig.Builder(servers).defaultMaxTotalConnectionPerRoute(2000).maxTotalConnection(5000).connTimeout(3000).readTimeout(3000).multiThreaded(true).build());
                        client = (JestHttpClient) factory.getObject();
                    }
                }
            }
            return client;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

2.es-java-service实例

import com.alibaba.fastjson.JSONObject;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import io.searchbox.params.Parameters;
import io.searchbox.params.SearchType;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Map;

/**
 * Author:me
 * Date:2018/12/21
 */
@Component
public class ESService {

    private static Logger LogUtil = LoggerFactory.getLogger(ESFactory.class);

    @Autowired
    private ESFactory esFactory;

    /**
     * 新增
     * @param index 索引
     * @param type 类型
     * @param docId  组件id
     * @param bodys dsl
     * @return
     */
    public JestResult add(String index, String type,String docId, String... bodys) {
        JestResult jestResult = null;
        try {
            Bulk.Builder bulkBuilder = new Bulk.Builder();
            for (String body : bodys) {
                Index builder = new Index.Builder(body).index(index).type(type).id(docId).build();
                bulkBuilder.addAction(builder);
            }
            jestResult = esFactory.getClient().execute(bulkBuilder.build());
            if (jestResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "add",
                                        index,
                                        type,
                                        bodys.toString(),
                                        jestResult.getErrorMessage(),
                                        String.valueOf(jestResult.getResponseCode()),
                                        String.valueOf(jestResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception ex) {
            LogUtil.error(ex.getMessage(), ex);
        }
        return jestResult;
    }

    /**
     * 删除
     * @param index 索引
     * @param type 类型
     * @param id doc-id
     * @return
     */
    public JestResult del(String index, String type, String id) {
        JestResult jestResult = null;
        try {
            Delete builder = new Delete.Builder(id).index(index).type(type).build();
            jestResult = esFactory.getClient().execute(builder);
            if (jestResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "del",
                                        index,
                                        type,
                                        id,
                                        jestResult.getErrorMessage(),
                                        String.valueOf(jestResult.getResponseCode()),
                                        String.valueOf(jestResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception ex) {
            LogUtil.error(ex.getMessage(), ex);
        }
        return jestResult;
    }

    /**
     * 默认更新,不重试
     * @param index 索引
     * @param type 类型
     * @param id id
     * @param upsertScript 更新脚本
     * @return
     */
    public JestResult upsert(String index, String type, String id, String upsertScript) {
        return upsert(index, type, id, upsertScript, 2);
    }

    /**
     *
     * @param index 索引
     * @param type 类型
     * @param id id
     * @param upsertScript 更新脚本
     * @param retry_on_conflict 失败重试
     * @return
     */
    public JestResult upsert(String index, String type, String id, String upsertScript, int retry_on_conflict) {
        JestResult result = null;
        LogUtil.info("upsert....upsertScript...:index="+index+",type="+type+",id="+id+",upsertScript="+upsertScript);
        try {
            Update update = new Update.Builder(upsertScript).index(index).type(type).id(id).setParameter(Parameters.RETRY_ON_CONFLICT, retry_on_conflict).build();
            result = esFactory.getClient().execute(update);
            if (!result.isSucceeded()) {
                throw new Exception(upsertScript + ":ES " + result.getErrorMessage());
            }

            if (result != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "upsert",
                                        index,
                                        type,
                                        upsertScript,
                                        result.getErrorMessage(),
                                        String.valueOf(result.getResponseCode()),
                                        String.valueOf(result.isSucceeded())},
                                "------"
                        )
                );
            }
        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        }
        return result;
    }

    /**
     * 自定义查询
     * @param index 索引
     * @param type 类型
     * @param dsl dsl
     * @return
     */
    public SearchResult search(String index, String type, String dsl) {
        SearchResult searchResult = null;
        try {
            Search search = new Search.Builder(dsl)
                    .addIndex(index)
                    .addType(type)
                    .build();
            searchResult = esFactory.getClient().execute(search);
            if (searchResult != null) {
//                LogUtil.info("search...jestResult:" + JSONObject.toJSONString(jestResult));
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "query",
                                        index,
                                        type,
                                        dsl,
                                        searchResult.getErrorMessage(),
                                        String.valueOf(searchResult.getResponseCode()),
                                        String.valueOf(searchResult.isSucceeded())},
                                "------")
                );
            }


        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        }
        return searchResult;
    }

    public JestResult bulkUpsert(String index, String type, int retry_on_conflict, Map upsertScript) {
        JestResult jestResult = null;
        if (upsertScript == null || upsertScript.size() == 0) {
            return jestResult;
        }
        try {
            Bulk.Builder bulkBuilder = new Bulk.Builder();
            for (Map.Entry script : upsertScript.entrySet()) {
                Update update = new Update.Builder(script.getValue()).index(index).type(type).id(script.getKey()).setParameter(Parameters.RETRY_ON_CONFLICT, retry_on_conflict).build();
                bulkBuilder.addAction(update);
            }
            jestResult = esFactory.getClient().execute(bulkBuilder.build());


            if (jestResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "bulkUpsert",
                                        index,
                                        type,
                                        upsertScript.toString(),
                                        jestResult.getErrorMessage(),
                                        String.valueOf(jestResult.getResponseCode()),
                                        String.valueOf(jestResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception ex) {
            LogUtil.error(ex.getMessage(), ex);
        }
        return jestResult;
    }

    public SearchResult scrollQuery(String queryBody, String index, String type, Integer size) {
        SearchResult searchResult = null;
        try {
            Search search = new Search.Builder(queryBody)
                    .addIndex(index)
                    .addType(type)
                    .setParameter(Parameters.SIZE, size)
                    .setParameter(Parameters.SCROLL, "1m")
                    .setSearchType(SearchType.SCAN)
                    .build();

            searchResult = esFactory.getClient().execute(search);
            if (searchResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "scrollQuery",
                                        index,
                                        type,
                                        queryBody,
                                        searchResult.getErrorMessage(),
                                        String.valueOf(searchResult.getResponseCode()),
                                        String.valueOf(searchResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        }
        return searchResult;
    }

    public JestResult scrollQuery(String scroll_id, Integer size) {
        JestResult jestResult = null;
        try {
            SearchScroll searchScroll = new SearchScroll.Builder(scroll_id, "1m").build();
            jestResult = esFactory.getClient().execute(searchScroll);

            if (jestResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "scrollQuery",
                                        scroll_id,
                                        jestResult.getErrorMessage(),
                                        String.valueOf(jestResult.getResponseCode()),
                                        String.valueOf(jestResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        }
        return jestResult;
    }

    public JestResult delByQuery(String index, String type, String query) {
        JestResult result = null;
        try {
            DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query)
                    .addIndex(index)
                    .addType(type)
                    .build();
            result = esFactory.getClient().execute(deleteByQuery);

            if (result != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "delByQuery",
                                        index,
                                        type,
                                        query,
                                        result.getErrorMessage(),
                                        String.valueOf(result.getResponseCode()),
                                        String.valueOf(result.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception ex) {
            LogUtil.error(ex.getMessage(), ex);
        }
        return result;
    }

    public JestResult searchCount(String index, String type, String dsl) {
        JestResult jestResult = null;
        try {
            Search search = new Search.Builder(dsl)
                    .setSearchType(SearchType.COUNT)
                    .addIndex(index)
                    .addType(type)
                    .build();
            jestResult = esFactory.getClient().execute(search);

            if (jestResult != null) {
                LogUtil.debug(
                        StringUtils.join(
                                new String[]{
                                        "query",
                                        index,
                                        type,
                                        dsl,
                                        jestResult.getErrorMessage(),
                                        String.valueOf(jestResult.getResponseCode()),
                                        String.valueOf(jestResult.isSucceeded())},
                                "------")
                );
            }
        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        }
        return jestResult;
    }
    
    /**
     * 建议搜索
     * @param index
     * @param type
     * @param dsl
     */
    public SuggestResult suggest(String index, String type,String dsl){
    	SuggestResult suggestResult = null;
    	
    	try {
    		Suggest suggest=new Suggest.Builder(dsl).addIndex(index)
                    //.addType(type)
                    .build();
    		suggestResult= esFactory.getClient().execute(suggest);
		} catch (IOException e) {
			LogUtil.error(e.getMessage(), e);
		}
    	return suggestResult;
    }
}

3.es搜索语句实例

import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.app.server.common.config.ConfigCenter;
import com.es.common.TableConstant;
import com.fastjson.JSON;
import com.viewworld.common.constants.ESEnums;
import com.viewworld.common.utils.PageResult;
import com.viewworld.dao.IComponentInfoDao;
import com.viewworld.dao.IComponentInfoNativeDao;
import com.viewworld.domain.dto.ComponentInfoTypeDto;
import com.viewworld.domain.entity.ComponentDetailInfoEntity;
import com.viewworld.domain.entity.ComponentInfoEntity;
import com.viewworld.domain.entity.ErpInfoDto;
import com.viewworld.service.IComponentEsService;
import com.viewworld.service.RangkingDao;
import com.viewworld.service.elasticSearch.ESService;
import entity.ComponentSearch;
import io.searchbox.client.JestResult;
import io.searchbox.core.SuggestResult;
import io.searchbox.core.SuggestResult.Suggestion;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import sun.font.Script;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

/**
* Author:
* Date:2018/12/21
* */
@Service
public class ComponentEsServiceImpl implements IComponentEsService {

    private static Logger log = LoggerFactory.getLogger(ComponentEsServiceImpl.class);

    @Autowired
    ESService esService;

    @Autowired
    ConfigCenter configCenter;

    @Autowired
    IComponentInfoDao componentInfoDao;

    @Autowired
    private IComponentInfoNativeDao componentInfoNativeDao;

    @Autowired
    private RangkingDao rangkingDao;

    /**
     * 提示词map
     * key :suggestName
     * value:suggestField
     */
    private Map suggestFieldMap;


    public ComponentEsServiceImpl(){
    	super();
    	suggestFieldMap = new HashMap();
    	suggestFieldMap.put("suggest-name", "name.completion");//中文提示
    	suggestFieldMap.put("suggest-cname", "cname.completion");//英文提示
    	suggestFieldMap.put("suggest-departName", "departName.completion");//部门提示
    }
    /**
     * es分页查询组件信息
     * @param domainId  领域id
     * @param keyword  关键词
     * @param pageNumber  起始页
     * @param pageSize  分页大小
     * @return
     */
    public PageResult list(Integer domainId, final String keyword, Integer compontentTypeId, int pageNumber, int pageSize) {
        PageResult page = new PageResult();
        List appList = new ArrayList();
        try{
            String filterIds = configCenter.getBusinessConfigValueByKey("filter.domain.ids");
            //字段分词匹配
            String dsl = buildQuery(keyword,domainId,pageNumber,pageSize,compontentTypeId,filterIds);
            //各字段精确匹配
            String termDsl = buildTermQuery(keyword,domainId,pageNumber,pageSize,compontentTypeId,filterIds);
            log.info("es...list...dsl="+dsl);
            log.info("es...list...termDsl="+termDsl);
            if(isTermMatch(domainId, keyword, compontentTypeId)){
                dsl = termDsl;
            }
            JestResult result = esService.search(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),dsl);
            JsonArray respArray = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
            long total=result.getJsonObject().getAsJsonObject("hits").get("total").getAsLong();

            if (respArray.size() > 0) {
                for(int i=0;i 0){
            return true;
        }
        return false;
    }

    /**
     * 新增
     * @param dto
     */
    public void add(ComponentInfoTypeDto dto) {
        try {
            String dsl = JSONObject.toJSONString(dto);
            String docId = String.valueOf(dto.getcId());
            esService.add(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),docId, dsl);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("add...es新增错误", e);
        }
    }

    /**
     * 删除
     * @param docId
     */
    public void del(String docId) {
        try {
            esService.del(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),docId);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("del...es删除错误", e);
        }
    }

    /**
     * 更新
     * @param dto
     */
    public void update(ComponentInfoTypeDto dto) {
        try {
            String id = String.valueOf(dto.getcId());
            String dsl = JSONObject.toJSONString(dto);
            log.info("dsl...update..."+dsl);
            String script = upsertDsl(dsl);
            esService.upsert(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),id,script);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("update...es修改错误", e);
        }
    }


	@Override
	public List suggest(String keyword, int size) {
		if(StringUtils.isEmpty(keyword)||size<=0){
			return Collections.EMPTY_LIST;
		}
		List listSuggestWord = new ArrayList();

		SuggestBuilder suggestBuilder=new SuggestBuilder();
		suggestBuilder.setText(keyword);

		for(Entry entry:suggestFieldMap.entrySet()){
			//中文提示
			CompletionSuggestionBuilder itemSuggest = new CompletionSuggestionBuilder(entry.getKey());
			itemSuggest.field(entry.getValue());
			itemSuggest.size(size);
			suggestBuilder.addSuggestion(itemSuggest);
		}

		SuggestResult suggestResult=esService.suggest(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(), suggestBuilder.toString());
		for(Entry entry:suggestFieldMap.entrySet()){
			List suggestionList = suggestResult.getSuggestions(entry.getKey());
	        for(SuggestResult.Suggestion suggestion:suggestionList){
	        	if(suggestion==null){
	        		continue;
	        	}
	        	List> listOptions = suggestion.options;
	        	if(!CollectionUtils.isEmpty(listOptions)){
	        		for(Map option:listOptions){
	        			String suggestWord=(String) option.get("text");
		        		if(listSuggestWord.size()0").append("){");
            script.append("ctx._source.productErp = ").append(dto.getProductErp()+";");
            script.append("ctx._source.sysLeaderErp = ").append(dto.getSysLeaderErp()+";");
            script.append("}");
            String upsert = JSONObject.toJSONString(dto);
            body.put("script", script.toString());
            body.put("upsert", "{}");*/
            JSONObject localObject = new JSONObject();
            localObject.put("productErp",dto.getProductErp());
            localObject.put("sysLeaderErp",dto.getSysLeaderErp());
            body.put("doc", localObject);
        }catch (Exception e){
            e.printStackTrace();
            log.error("localUpsertDsl...error"+e);
        }
        return body.toJSONString();
    }

    public boolean queryByIdExist(Integer cid){
        String dsl = queryByIdDsl(String.valueOf(cid));
        JestResult res = esService.search(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),dsl);
        JsonArray respArray = res.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
        log.info("queryByIdExist...respArray..."+respArray);
        if (respArray.size() > 0) {
            return true;
        }
        return false;
    }

    /**
     * 根据id查询数据
     * @param cid
     * @return
     */
    private String queryByIdDsl(String cid) {
        return "{"+
                "\"query\" : {"+
                "\"term\" : { \"cId\" : "+cid+" }"+
                "}"+
                "}";
    }

    /**
     * 组件查询
     * @param keyword
     * @param domainId
     * @return
     */
    private String queryDsl(String keyword,int domainId,int from,int size,Integer compontentTypeId) {

        String doAndStr = this.queryDslWhereAnd(domainId,compontentTypeId);
        String whereOr =this.queryDslWhereOr(keyword);

        String sortStr ="," +
                "    \"sort\":{" +
                "        \"createDate\":{" +
                "            \"order\":\"desc\"" +
                "        }" +
                "    }";

        return "{" +
                "  \"from\": "+from+"," +
                "  \"size\": "+size+"," +
                whereOr+
                doAndStr +
                "      ]" +
                "    }" +
                "  }" +
                sortStr+
                "}";
    }

    /**
     * 构建查询语句
     * 
     * {
		  "from" : 0,
		  "size" : 10,
		  "query" : {
		    "bool" : {
		      "must" : [ {
		        "match" : {
		          "domainId" : {
		            "query" : 12321
		          }
		        }
		      }, {
		        "match" : {
		          "componentTypeId" : {
		            "query" : 2
		          }
		        }
		      }, {
		        "bool" : {
		          "should" : [ {
		            "match" : {
		              "departName" : {
		                "query" : "com.jd.real.stock.export.SiteExport"
		              }
		            }
		          }, {
		            "match" : {
		              "productErp" : {
		                "query" : "com.jd.real.stock.export.SiteExport"
		              }
		            }
		          }, {
		            "match" : {
		              "sysLeaderErp" : {
		                "query" : "com.jd.real.stock.export.SiteExport"
		              }
		            }
		          }, {
		            "match" : {
		              "name" : {
		                "query" : "com.jd.real.stock.export.SiteExport"
		              }
		            }
		          }, {
		            "match" : {
		              "cname" : {
		                "query" : "com.jd.real.stock.export.SiteExport"
		              }
		            }
		          } ]
		        }
		      } ]
		    }
		  },
		  "sort" : [ {
		    "createDate" : {
		      "order" : "desc"
		    }
		  } ]
		}
     * 
* @date * @param keyword * @param domainId * @param from * @param size * @param compontentTypeId * @return */ private static String buildQuery(String keyword,int domainId,int from,int size,Integer compontentTypeId,String filterIds){ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.from(from); searchSourceBuilder.size(size); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); //组件类型、组件id if(domainId>0||(compontentTypeId!=null&&compontentTypeId>0)){ if(domainId>0){ QueryBuilder domainIdBuilder= new MatchQueryBuilder(ESEnums.ComFields.DOMAINID.getField(), domainId); boolQueryBuilder.must(domainIdBuilder); } if(compontentTypeId!=null&&compontentTypeId>0){ QueryBuilder componentTypeBuilder= new MatchQueryBuilder(ESEnums.ComFields.COMPONENTTYPEID.getField(), compontentTypeId); boolQueryBuilder.must(componentTypeBuilder); } if(StringUtils.isNotBlank(filterIds)){ int domainIdData= Integer.parseInt(filterIds); log.info("filterIds...buildQuery...start...domainIdData="+domainIdData); QueryBuilder domainIdBuilder= new MatchQueryBuilder(ESEnums.ComFields.DOMAINID.getField(), domainIdData); boolQueryBuilder.mustNot(domainIdBuilder); } } if(!StringUtils.isEmpty(keyword)){ BoolQueryBuilder keyWordBuilder = new BoolQueryBuilder(); //部门信息 QueryBuilder departmentBuilder = new MatchQueryBuilder(ESEnums.ComFields.DEPARTNAME.getField(), keyword); keyWordBuilder.should(departmentBuilder); //产品负责人 QueryBuilder productErpBuilder = new MatchQueryBuilder(ESEnums.ComFields.PRODUCTERP.getField(), keyword); keyWordBuilder.should(productErpBuilder); //研发负责 QueryBuilder sysLeaderErpBuilder = new MatchQueryBuilder(ESEnums.ComFields.SYSLEADERERP.getField(), keyword); keyWordBuilder.should(sysLeaderErpBuilder); //组件英文名称 QueryBuilder nameBuilder = new MatchQueryBuilder(ESEnums.ComFields.NAME.getField(), keyword); keyWordBuilder.should(nameBuilder); //组件中文名称 QueryBuilder cnameBuilder = new MatchQueryBuilder(ESEnums.ComFields.CNAME.getField(), keyword); keyWordBuilder.should(cnameBuilder); //领域名称 QueryBuilder domainNameBuilder = new MatchQueryBuilder(ESEnums.ComFields.DOMAINNAME.getField(), keyword); keyWordBuilder.should(domainNameBuilder); boolQueryBuilder.must(keyWordBuilder); //加高亮 searchSourceBuilder.highlight(buildHighlight()); }else{ //如果有关键子 安得分排序 否则按时间排序 searchSourceBuilder.sort(ESEnums.ComFields.CREATEDATE.getField(), SortOrder.DESC); } searchSourceBuilder.query(boolQueryBuilder); return searchSourceBuilder.toString(); } private static String buildTermQuery(String keyword,int domainId,int from,int size,Integer compontentTypeId,String filterIds){ SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.from(from); searchSourceBuilder.size(size); BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); //组件类型、组件id if(domainId>0||(compontentTypeId!=null&&compontentTypeId>0)){ if(domainId>0){ QueryBuilder domainIdBuilder= new MatchQueryBuilder(ESEnums.ComFields.DOMAINID.getField(), domainId); boolQueryBuilder.must(domainIdBuilder); } if(compontentTypeId!=null&&compontentTypeId>0){ QueryBuilder componentTypeBuilder= new MatchQueryBuilder(ESEnums.ComFields.COMPONENTTYPEID.getField(), compontentTypeId); boolQueryBuilder.must(componentTypeBuilder); } if(StringUtils.isNotBlank(filterIds)){ int domainIdData= Integer.parseInt(filterIds); log.info("filterIds...buildQuery...start...domainIdData="+domainIdData); QueryBuilder domainIdBuilder= new MatchQueryBuilder(ESEnums.ComFields.DOMAINID.getField(), domainIdData); boolQueryBuilder.mustNot(domainIdBuilder); } } if(!StringUtils.isEmpty(keyword)){ BoolQueryBuilder keyWordBuilder = new BoolQueryBuilder(); //部门信息 QueryBuilder departmentBuilder = new TermQueryBuilder(ESEnums.ComFields.DEPARTNAME.getField()+ESEnums.FIELD_SUFFIX, keyword); keyWordBuilder.should(departmentBuilder); //产品负责人 // QueryBuilder productErpBuilder = new TermQueryBuilder(ESEnums.ComFields.PRODUCTERP.getField()+ESEnums.FIELD_SUFFIX, keyword); // keyWordBuilder.should(productErpBuilder); //研发负责 // QueryBuilder sysLeaderErpBuilder = new TermQueryBuilder(ESEnums.ComFields.SYSLEADERERP.getField()+ESEnums.FIELD_SUFFIX, keyword); // keyWordBuilder.should(sysLeaderErpBuilder); //组件英文名称 QueryBuilder nameBuilder = new TermQueryBuilder(ESEnums.ComFields.NAME.getField()+ESEnums.FIELD_SUFFIX, keyword); keyWordBuilder.should(nameBuilder); //组件中文名称 QueryBuilder cnameBuilder = new TermQueryBuilder(ESEnums.ComFields.CNAME.getField()+ESEnums.FIELD_SUFFIX, keyword); keyWordBuilder.should(cnameBuilder); //领域名称 QueryBuilder domainNameBuilder = new TermQueryBuilder(ESEnums.ComFields.DOMAINNAME.getField()+ESEnums.FIELD_SUFFIX, keyword); keyWordBuilder.should(domainNameBuilder); boolQueryBuilder.must(keyWordBuilder); //加高亮 searchSourceBuilder.highlight(buildHighlight()); }else{ //如果有关键子 安得分排序 否则按时间排序 searchSourceBuilder.sort(ESEnums.ComFields.CREATEDATE.getField(), SortOrder.DESC); } searchSourceBuilder.query(boolQueryBuilder); return searchSourceBuilder.toString(); } public static HighlightBuilder buildHighlight(){ HighlightBuilder hb = new HighlightBuilder(); hb.field(ESEnums.ComFields.DEPARTNAME.getField()); hb.field(ESEnums.ComFields.PRODUCTERP.getField()); hb.field(ESEnums.ComFields.SYSLEADERERP.getField()); hb.field(ESEnums.ComFields.NAME.getField()); hb.field(ESEnums.ComFields.CNAME.getField()); hb.field(ESEnums.ComFields.DOMAINNAME.getField()); return hb; } /**组件查询总个数 * @param keyword * @param domainId * @return */ private String queryCount(String keyword,int domainId,Integer compontentTypeId) { String doAndStr = this.queryDslWhereAnd(domainId,compontentTypeId); String whereOr =this.queryDslWhereOr(keyword); return "{" + whereOr+ doAndStr + " ]" + " }" + " }" + "}"; } /** * 多字段与条件 * @param domainId * @param compontentTypeId * @return */ private String queryDslWhereAnd(int domainId,Integer compontentTypeId) { String doMainStr = ""; if (domainId != 0) { doMainStr = "{\"term\": { \"domainId\": \"" + domainId + "\"} },"; } String doAndStr = " ,{" + " \"bool\": {" + " \"must\": [" + doMainStr + " {\"term\": { \"componentTypeId\": \"" + compontentTypeId + "\"} }" + " ]" + " }" + " }"; return doAndStr; } /** * 多字段或条件 * @param keyword * @return */ private String queryDslWhereOr(String keyword) { String keywordQuery="*"; if(org.apache.commons.lang3.StringUtils.isNotBlank(keyword)){ keywordQuery = "*"+keyword+"*"; } String doOrStr = " \"query\": {" + " \"bool\": {" + " \"must\": [" + " {\n" + " \"bool\": {" + " \"should\": [" + " { \"term\": { \"departName\": \""+keyword+"\"} }," + " { \"wildcard\": { \"productErp\": \""+keywordQuery.toLowerCase()+"\"} }," + " { \"wildcard\": { \"sysLeaderErp\": \""+keywordQuery.toLowerCase()+"\"} }," + " { \"wildcard\": { \"name\": \""+keywordQuery.toLowerCase()+"\"} }," + " { \"wildcard\": { \"cname\": \""+keywordQuery+"\"} }" + " ]" + " }" + " }" ; return doOrStr; } public void updateComponentToEs(ComponentInfoEntity componentInfoEntity){ Integer componentId = componentInfoEntity.getId(); if(configCenter.isDegradeSwitchOn("es.component.search.switch")) { try{ //es增量修改应用 ComponentSearch cs = rangkingDao.findDomainInfo(componentId).get(0); ComponentDetailInfoEntity providerInfo = componentInfoNativeDao.providerInfo(componentId); String leadErps = ""; for (ErpInfoDto erpInfoDto : providerInfo.getLeadErpList()) { leadErps = leadErps + erpInfoDto.getErp() + ","; } if (StringUtils.isNotBlank(leadErps)) { leadErps = leadErps.substring(0, leadErps.length() - 1); } String proErps = ""; for (ErpInfoDto erpInfoDto : providerInfo.getProErpList()) { proErps = proErps + erpInfoDto.getErp() + ","; } if (StringUtils.isNotBlank(proErps)) { proErps = proErps.substring(0, proErps.length() - 1); } int domainComponentId = 0; if (StringUtils.isNotBlank(cs.getDomainId())) { domainComponentId = Integer.parseInt(cs.getDomainId()); } this.addAppByEs(componentInfoEntity, domainComponentId, leadErps, proErps, false); }catch (Exception e){ e.printStackTrace(); log.error("ComponentEsServiceImpl...updateComponentToEs...error..."+e); } } } /** * 增量插入应用 */ private void addAppByEs(ComponentInfoEntity com, int domainComponentId, String projectManager, String productManagers, boolean flag){ try{ ComponentInfoEntity domainEntity = componentInfoDao.findById(domainComponentId); ComponentInfoTypeDto dto = new ComponentInfoTypeDto(); dto.setcId(com.getId()); dto.setName(com.getName()); dto.setCname(com.getCname()); dto.setComponentTypeId(com.getCompontentTypeId()); dto.setDepartName(com.getDeptName()); if(null!=domainEntity){ dto.setDomainName(domainEntity.getName()); } dto.setDomainId(domainComponentId); dto.setUpdateDate(new Date()); if(null!=com && 0!=com.getId()){ //查询es里面是否有该数据 如果有则是修改 那么不需要更新相关人 如果没有查到则是新增 那么需要把相关人也初始化到es if(!this.queryByIdExist(com.getId())){//es新增 dto.setProductErp(productManagers); dto.setSysLeaderErp(projectManager); dto.setCreateDate(new Date()); dto.setYn(1); } } this.update(dto); //this.add(dto); }catch (Exception e){ e.printStackTrace(); log.error("ComponentEsServiceImpl...updateComponentToEs...error..."+e); } } /** * 过滤屏蔽的领域以及其下的所有接口和应用 * */ public boolean filterData(ComponentSearch csearch){ String filterIds = configCenter.getBusinessConfigValueByKey("filter.domain.ids"); log.info("filterData...filterIds"+filterIds); boolean flag = false; if(null!=csearch && StringUtils.isNotBlank(csearch.getDomainId())){ flag = Arrays.asList(filterIds.split(",")).contains(csearch.getDomainId()); } log.info("filterData...filterIds"+filterIds+",flag="+flag); return flag; } }

你可能感兴趣的:(知识点汇总)