Elasticsearch6学习笔记——TransportClient连接

Elasticsearch Java API有四类client连接方式

  • TransportClient
  • RestClient
  • Jest
  • Spring Data Elasticsearch

其中TransportClient和RestClient是Elasticsearch原生的api。TransportClient可以支持2.x,5.x版本,TransportClient将会在Elasticsearch 7.0弃用并在8.0中完成删除,因此不推荐后续使用;而Jest由于是社区维护,所以更新有一定延迟,目前最新版对接ES6.3.1,近一个月只有四个issue,说明整体活跃度较低,因此也不推荐使用;Spring Data Elasticsearch主要是与Spring生态对接,可以在web系统中整合到Spring中使用。目前比较推荐使用官方的高阶、低阶Rest Client,官方维护,比较值得信赖。

所需要的JAR包

<dependency>
    <groupId>org.elasticsearch.client</groupId>
		<artifactId>transport</artifactId>
		<version>6.4.2</version>
	</dependency>
	<dependency>
		<groupId>org.elasticsearch</groupId>
		<artifactId>elasticsearch</artifactId>
		<version>6.4.2</version>
</dependency>

实体类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

/**
 * @Description: 物料视图
 */
@Entity
@Table(name = "material_view", schema = "")
@SuppressWarnings("serial")
public class MaterialView implements java.io.Serializable {
	
	/** 主键 */
	private java.lang.String id;
	/** 物料名称 */
	private java.lang.String equipmentName;
	/** 品牌名称 */
	private java.lang.String brandName;
	private java.lang.String brandCode;
	/** 供应商 */
	private java.lang.String supplierName;
	private java.lang.String supplierId;
	/** 型号 */
	private java.lang.String model;
	/** 规格 */
	private java.lang.String type;
	/** 详细信息 */
	private java.lang.String paramInfo;
	/** 一级分类 */
	private java.lang.String levelOneName;
	/** 二级分类 */
	private java.lang.String levelTwoName;
	/** 三级分类 */
	private java.lang.String levelThreeName;
	private java.lang.String levelOneCode;
	private java.lang.String levelTwoCode;
	private java.lang.String levelThreeCode;
	private java.lang.Integer createDate;
	/** 市场价--面价 */
	private Double facePrice;
	/** 设计成本价 */
	private Double designCost;
	/** 采购成本价 */
	private Double purchaseCost;
	/** 备注 */
	private java.lang.String remake;
	/** 图片 */
	private java.lang.String img;
	
	public MaterialView() {
		// TODO Auto-generated constructor stub
	}
	
	public MaterialView(String id, String equipmentName, String brandName, String brandCode, String supplierName,
			String supplierId, String model, String type, String paramInfo, String levelOneName, String levelTwoName,
			String levelThreeName, String levelOneCode, String levelTwoCode, String levelThreeCode, Integer createDate,
			Double facePrice, Double designCost, Double purchaseCost, String remake, String img) {
		super();
		this.id = id;
		this.equipmentName = equipmentName;
		this.brandName = brandName;
		this.brandCode = brandCode;
		this.supplierName = supplierName;
		this.supplierId = supplierId;
		this.model = model;
		this.type = type;
		this.paramInfo = paramInfo;
		this.levelOneName = levelOneName;
		this.levelTwoName = levelTwoName;
		this.levelThreeName = levelThreeName;
		this.levelOneCode = levelOneCode;
		this.levelTwoCode = levelTwoCode;
		this.levelThreeCode = levelThreeCode;
		this.createDate = createDate;
		this.facePrice = facePrice;
		this.designCost = designCost;
		this.purchaseCost = purchaseCost;
		this.remake = remake;
		this.img = img;
	}

	/**
	 * 方法: 取得java.lang.String
	 * 
	 * @return: java.lang.String 主键
	 */
	@Id
	@GeneratedValue(generator = "paymentableGenerator")
	@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
	@Column(name = "ID", nullable = false, length = 36)
	public java.lang.String getId() {
		return this.id;
	}

	/**
	 * 方法: 设置java.lang.String
	 * 
	 * @param: java.lang.String 主键
	 */
	public void setId(java.lang.String id) {
		this.id = id;
	}

	@Column(name = "equipmentName", nullable = true)
	public java.lang.String getEquipmentName() {
		return equipmentName;
	}

	public void setEquipmentName(java.lang.String equipmentName) {
		this.equipmentName = equipmentName;
	}

	@Column(name = "brandName", nullable = true)
	public java.lang.String getBrandName() {
		return brandName;
	}

	public void setBrandName(java.lang.String brandName) {
		this.brandName = brandName;
	}

	@Column(name = "model", nullable = true)
	public java.lang.String getModel() {
		return model;
	}

	public void setModel(java.lang.String model) {
		this.model = model;
	}

	@Column(name = "type", nullable = true)
	public java.lang.String getType() {
		return type;
	}

	public void setType(java.lang.String type) {
		this.type = type;
	}

	@Column(name = "paramInfo", nullable = true)
	public java.lang.String getParamInfo() {
		return paramInfo;
	}

	public void setParamInfo(java.lang.String paramInfo) {
		this.paramInfo = paramInfo;
	}

	@Column(name = "levelOneName", nullable = true)
	public java.lang.String getLevelOneName() {
		return levelOneName;
	}

	public void setLevelOneName(java.lang.String levelOneName) {
		this.levelOneName = levelOneName;
	}

	@Column(name = "levelTwoName", nullable = true)
	public java.lang.String getLevelTwoName() {
		return levelTwoName;
	}

	public void setLevelTwoName(java.lang.String levelTwoName) {
		this.levelTwoName = levelTwoName;
	}

	@Column(name = "levelThreeName", nullable = true)
	public java.lang.String getLevelThreeName() {
		return levelThreeName;
	}

	public void setLevelThreeName(java.lang.String levelThreeName) {
		this.levelThreeName = levelThreeName;
	}

	@Column(name = "brandCode", nullable = true)
	public java.lang.String getBrandCode() {
		return brandCode;
	}

	public void setBrandCode(java.lang.String brandCode) {
		this.brandCode = brandCode;
	}

	@Column(name = "levelOneCode", nullable = true)
	public java.lang.String getLevelOneCode() {
		return levelOneCode;
	}

	public void setLevelOneCode(java.lang.String levelOneCode) {
		this.levelOneCode = levelOneCode;
	}

	@Column(name = "levelTwoCode", nullable = true)
	public java.lang.String getLevelTwoCode() {
		return levelTwoCode;
	}

	public void setLevelTwoCode(java.lang.String levelTwoCode) {
		this.levelTwoCode = levelTwoCode;
	}

	@Column(name = "levelThreeCode", nullable = true)
	public java.lang.String getLevelThreeCode() {
		return levelThreeCode;
	}

	public void setLevelThreeCode(java.lang.String levelThreeCode) {
		this.levelThreeCode = levelThreeCode;
	}

	@Column(name = "supplierName", nullable = true)
	public java.lang.String getSupplierName() {
		return supplierName;
	}

	public void setSupplierName(java.lang.String supplierName) {
		this.supplierName = supplierName;
	}

	@Column(name = "createDate", nullable = true)
	public Integer getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Integer createDate) {
		this.createDate = createDate;
	}

	@Column(name = "supplierId", nullable = true)
	public java.lang.String getSupplierId() {
		return supplierId;
	}

	public void setSupplierId(java.lang.String supplierId) {
		this.supplierId = supplierId;
	}

	@Column(name = "facePrice", nullable = true)
	public Double getFacePrice() {
		return facePrice;
	}

	public void setFacePrice(Double facePrice) {
		this.facePrice = facePrice;
	}

	@Column(name = "designCost", nullable = true)
	public Double getDesignCost() {
		return designCost;
	}

	public void setDesignCost(Double designCost) {
		this.designCost = designCost;
	}

	@Column(name = "purchaseCost", nullable = true)
	public Double getPurchaseCost() {
		return purchaseCost;
	}

	public void setPurchaseCost(Double purchaseCost) {
		this.purchaseCost = purchaseCost;
	}

	@Column(name = "remake", nullable = true)
	public java.lang.String getRemake() {
		return remake;
	}

	public void setRemake(java.lang.String remake) {
		this.remake = remake;
	}

	@Column(name = "img", nullable = true)
	public java.lang.String getImg() {
		return img;
	}

	public void setImg(java.lang.String img) {
		this.img = img;
	}
	
}

获取连接的工具类

package com.jeecg.yw.util;

import java.net.InetAddress;
import java.net.UnknownHostException;

import javax.annotation.PostConstruct;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.stereotype.Component;

/**
 * 	获取ES连接
 * @author jins
 *
 */
@Component
public class ESClientUtil {
	//项目启动直接获取连接  并且在使用中不关闭
	@PostConstruct
    void init() {
        // 避免netty冲突
        System.setProperty("es.set.netty.runtime.available.processors", "false");
        getClient();
    }
	
	//集群名称
	private static final String CLUSTERNAME = "es-cluster";
	//ES服务器地址
	private static final String IP = "192.168.0.119";
	//ES服务器端口
	private static final Integer PORT = 9300;
	
	private static TransportClient client;
	
	private ESClientUtil() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * 	获取elasticsearch客户端连接
	 * @return
	 */
	@SuppressWarnings("resource")
	public static TransportClient getClient() {
		try {
			if(client == null) {
				//指定集群
				Settings settings = Settings.builder().put("cluster.name", CLUSTERNAME).build();
				//创建访问ES服务器端客户端
				client = new PreBuiltTransportClient(settings)
						// 设置集群的节点                             
						.addTransportAddress(new TransportAddress(InetAddress.getByName(IP), PORT));
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return client;
	}
}

CRUD的方法

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder.Type;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.util.PinyinUtil;
import org.jeecgframework.core.util.StringUtil;
import org.springframework.cglib.core.ReflectUtils;

import com.alibaba.fastjson.JSONObject;
import com.jeecg.yw.entity.MaterialView;

import cn.hutool.core.date.DateUtil;

public class ESMaterialUtil {

	//索引名称--数据库名
	private static final String INDEX_NAME = "cos";
	//类型名称--表名
	private static final String TYPE_NAME = "material";

	/**
	 * 	创建mapping
	 *
	 * @return
	 * @throws Exception 
	 */
	public static AjaxJson createMapping() throws Exception {
		AjaxJson j = new AjaxJson();

		TransportClient client = ESClientUtil.getClient();

		Settings.Builder settings = Settings.builder()
				//数据分片数,默认为5,有时候设置为3
				.put("number_of_shards", 3)
				//数据备份数,如果只有一台机器,设置为0
				.put("number_of_replicas", 0);

		XContentBuilder builder = XContentFactory.jsonBuilder()
				.startObject()
				.startObject("properties")
				.startObject("id")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("equipmentName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("model")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("type")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("brandName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("brandCode")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("supplierName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("supplierId")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("levelOneName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("levelTwoName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("levelThreeName")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("levelOneCode")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("levelTwoCode")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("levelThreeCode")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.startObject("paramInfo")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("createDate")
				.field("type", "integer")
				.field("store", true)
				.endObject()
				.startObject("remake")
				.field("type", "text")
				.field("store", true)
				.field("analyzer", "ik_max_word")
				.field("search_analyzer", "ik_max_word")
				.endObject()
				.startObject("facePrice")
				.field("type", "double")
				.field("store", true)
				.endObject()
				.startObject("designCost")
				.field("type", "double")
				.field("store", true)
				.endObject()
				.startObject("purchaseCost")
				.field("type", "double")
				.field("store", true)
				.endObject()
				.startObject("img")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.endObject()
				.endObject();

		CreateIndexRequestBuilder prepareCreate = client.admin().indices().prepareCreate(INDEX_NAME);
		//管理索引(user_info)然后关联type(user)
		prepareCreate.setSettings(settings).addMapping(TYPE_NAME, builder).get();

		//client.close();

		j.setObj(null);
		return j;
	}

	/**
	 * 	同步物料信息
	 *
	 * @return
	 * @throws Exception 
	 */
	public static AjaxJson synchronizeData(List<MaterialView> list) throws Exception {
		AjaxJson j = new AjaxJson();

		TransportClient client = ESClientUtil.getClient();
		int num = 0;
		for (MaterialView m : list) {

			XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
					.field("brandCode", m.getBrandCode())
					.field("brandName", m.getBrandName())
					.field("equipmentName", m.getEquipmentName())
					.field("id", m.getId())
					.field("levelOneName", m.getLevelOneName())
					.field("levelOneCode", m.getLevelOneCode())
					.field("levelThreeName", m.getLevelThreeName())
					.field("levelThreeCode", m.getLevelThreeCode())
					.field("levelTwoName", m.getLevelTwoName())
					.field("levelTwoCode", m.getLevelTwoCode())
					.field("model", m.getModel())
					.field("paramInfo", m.getParamInfo())
					.field("supplierName", m.getSupplierName())
					.field("supplierId", m.getSupplierId())
					.field("type", m.getType())
					.field("remake", m.getRemake())
					.field("facePrice", m.getFacePrice())
					.field("designCost", m.getDesignCost())
					.field("purchaseCost", m.getPurchaseCost())
					.field("img", m.getImg())
					.field("createDate", m.getCreateDate())
					.endObject();
			IndexResponse response = client.prepareIndex(INDEX_NAME, TYPE_NAME, m.getId()).setSource(builder).get();

			System.err.println((++num)+"-------------->"+response.status());
		}

		//client.close();
		j.setMsg("同步物料数量:"+num);
		return j;
	}

	/**
	 * 
	 * @param page				分页
	 * @param keyword			搜索关键词-物料名称、详细参数、型号、规格、备注
	 * @param brandCodes		品牌CODES
	 * @param supplierIds		供应商IDS
	 * @param levelOneCode		一级分类CODE
	 * @param levelTwoCode		二级分类CODE
	 * @param levelThreeCode	三级分类CODE
	 * @return
	 */
	public static PageUtil scrollPage(PageUtil page, String keyword, String brandCodes, String supplierIds,
			String levelOneCode, String levelTwoCode, String levelThreeCode) {
		int pageSize = page.getRows();
		int currentPageNo = page.getPage();
		TransportClient client = ESClientUtil.getClient();
		// 组织查询条件
		BoolQueryBuilder query = setBoolQueryBuilder(keyword, brandCodes, supplierIds, levelOneCode, levelTwoCode, levelThreeCode);

		// 设置高亮属性
		// 高亮设置
		HighlightBuilder highlightBuilder = new HighlightBuilder();
		highlightBuilder.requireFieldMatch(false)
		.field("equipmentName")
		.field("paramInfo")
		.field("model")
		.field("remake")
		.field("type")
		.preTags("<strong class=\"highlight\">").postTags("</strong>");

		// Scroll查询请求
		// 首次搜索 包含数据
		SearchResponse searchResponse = client.prepareSearch(INDEX_NAME)
				.setTypes(TYPE_NAME)
				// 排序
				.addSort("createDate", SortOrder.ASC)
				// 执行检索的类别
				.setSearchType(SearchType.DEFAULT)
				.highlighter(highlightBuilder)
				// 指定超时时间
				.setScroll(TimeValue.timeValueMinutes(1))
				// 查询条件
				.setQuery(query)
				// 大小
				.setSize(page.getRows())
				//字段过滤
				.setFetchSource(
						new String[]{"brandName","equipmentName","id","levelOneName","levelTwoName","levelThreeName","model",
								"paramInfo","supplierName","type","remake","facePrice","designCost","purchaseCost","img"},
						new String[]{"brandCode", "levelOneCode", "levelTwoCode", "levelThreeCode", "supplierId", "createDate"}
				)
				.execute()
				.actionGet();
		// 获取查询总数量
		Long totalCount = searchResponse.getHits().getTotalHits();
		// 设置分页数据总数
		page.setTotal(totalCount.intValue());
		List<MaterialView> result = new ArrayList<>(pageSize);
		// 查询总数量为0,直接返回
		if (totalCount == 0) {
			page.setResults(result);
			return page;
		}
		// 计算总页数
		long pageCount = totalCount % (long) pageSize == 0L ? totalCount / (long) pageSize : totalCount / (long) pageSize + 1L;
		// 重新设置当前页数
		if (pageCount == 1 || pageCount <= currentPageNo) {
			currentPageNo = (int) pageCount;
		}
		// 获取currentPageNo的数据,从Scroll快照拿数据,首页数据已经拿到,
		for (int i = 2; i <= currentPageNo; i++) {
			// 从第二页开始,使用上次搜索结果的ScrollId,从Scroll快照拿数据
			searchResponse = client
					.prepareSearchScroll(searchResponse.getScrollId())
					.setScroll(TimeValue.timeValueMinutes(1))
					.execute()
					.actionGet();
		}
		// 获取分页结果
		SearchHits hits = searchResponse.getHits();
		MaterialView entityEsDto= null;
		// 遍历转换结果对象
		for (SearchHit searchHit : hits) {

			entityEsDto = (MaterialView) ReflectUtils.newInstance(MaterialView.class);
			//entityEsDto = JSONObject.parseObject(searchHit.getSourceAsString(), MaterialView.class);

			try {
				FieldUtils.writeField(entityEsDto, "id", searchHit.getId(), true);
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}

			// 非高亮字段的数据写入
			for (Map.Entry<String, Object> entry : searchHit.getSourceAsMap().entrySet()) {

				Field field = FieldUtils.getField(MaterialView.class, entry.getKey(), true);
				// 判断字段不存在
				if (null == field) {
					continue;
				}

				try {
					FieldUtils.writeField(entityEsDto, entry.getKey(), entry.getValue(), true);
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}

			for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightFields().entrySet()) {
				StringBuilder sb = new StringBuilder();
				Text[] fragments = entry.getValue().getFragments();
				for (Text fragment : fragments) {
					sb.append(fragment.toString());
				}

				// 写入高亮的内容
				try {
					String str = sb.toString();
					if("equipmentName".equals(entry.getKey())) {//替换物料名称的class属性
						str = str.replaceAll("class=\"highlight\"", "class=\"highlight2\"");
						FieldUtils.writeField(entityEsDto, entry.getKey(), str, true);
					}else {
						FieldUtils.writeField(entityEsDto, entry.getKey(), str, true);
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}

			result.add(entityEsDto);
			//直接转换搜索结果
			//			entityEsDto= JSONObject.parseObject(searchHit.getSourceAsString(), MaterialView.class);
			//			if (Objects.nonNull(entityEsDto)) {
			//				// 设置主键
			//				entityEsDto.setId(searchHit.getId());
			//				result.add(entityEsDto);
			//			}
		}

		//封装结果
		List<Map<String, Object>> resultList = new ArrayList<>();
		for (MaterialView mat : result) {
			Map<String, Object> material = new HashMap<String, Object>();
			material.put("id", mat.getId());
			material.put("equipment_name", mat.getEquipmentName());
			material.put("sys_level_one", mat.getLevelOneCode());
			material.put("img", mat.getImg());
			material.put("brand", mat.getBrandCode());
			material.put("model", mat.getModel());
			material.put("remake", mat.getRemake());
			material.put("param_info", mat.getParamInfo());
			material.put("sys_level_two", mat.getLevelTwoCode());
			material.put("sys_level_three", mat.getLevelThreeCode());
			material.put("supplier", mat.getSupplierName());
			material.put("type", mat.getType());
			material.put("brandName", mat.getBrandName());


			Map<String, Object> resultMap = new HashMap<>();
			resultMap.put("material", material);

			resultMap.put("getSysLevelOne", mat.getLevelOneName());
			resultMap.put("getSysLevelTwo", mat.getLevelTwoName());
			resultMap.put("getSysLevelThree", mat.getLevelThreeName());

			resultList.add(resultMap);
		}

		page.setPage(currentPageNo);
		page.setResults(resultList);

		return page;
	}

	/**
	 * 
	 * @param keyword			搜索关键词-物料名称、详细参数、型号、规格、备注
	 * @param brandCodes		品牌CODES
	 * @param supplierIds		供应商IDS
	 * @param levelOneCode		一级分类CODE
	 * @param levelTwoCode		二级分类CODE
	 * @param levelThreeCode	三级分类CODE
	 * @return
	 */
	public static BoolQueryBuilder setBoolQueryBuilder(String keyword, String brandCodes, String supplierIds, 
			String levelOneCode, String levelTwoCode, String levelThreeCode) {

		BoolQueryBuilder query = QueryBuilders.boolQuery();

		if (StringUtil.isNotEmpty(keyword)) {
			// 条件  字段    字段.....
			// 物料名称、详细参数、型号、规格、备注
			MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, 
					"equipmentName",
					"paramInfo", 
					"model", 
					"remake", 
					//minmum_should_match为百分之百的时候,效果等同于operator为and的情况
					"type").operator(Operator.OR).type(Type.CROSS_FIELDS).minimumShouldMatch("95%");

			query.should(queryBuilder);
		}

		// 添加 关键字模糊匹配条件 不分词实现sql like模糊匹配效果,使用es wildcard 通配符搜索
		//        if (StringUtil.isNotEmpty(key)) {
		//            QueryBuilder query1 = QueryBuilders.wildcardQuery("key", "*" + key + "*");
		//            query.must(query1);
		//        }

		//添加 状态条件
		if (StringUtil.isNotEmpty(levelOneCode)) {
			QueryBuilder query2 = QueryBuilders.termQuery("levelOneCode", levelOneCode);
			query.must(query2);
		}
		//添加 状态条件
		if (StringUtil.isNotEmpty(levelTwoCode)) {
			QueryBuilder query2 = QueryBuilders.termQuery("levelTwoCode", levelTwoCode);
			query.must(query2);
		}
		// termQuery不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。
		if (StringUtil.isNotEmpty(levelThreeCode)) {
			QueryBuilder query2 = QueryBuilders.termQuery("levelThreeCode", levelThreeCode);
			query.must(query2);
		}

		//添加 状态条件
		if (StringUtil.isNotEmpty(brandCodes)) {
			QueryBuilder query2 = QueryBuilders.matchQuery("brandCode", brandCodes);
			query.must(query2);
		}

		// matchQuery-会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
		if (StringUtil.isNotEmpty(supplierIds)) {
			QueryBuilder query2 = QueryBuilders.matchQuery("supplierId", supplierIds);
			query.must(query2);
		}

		// 添加 开始时间 结束时间范围条件
		//        if (begin != null && end != null) {
		//            QueryBuilder query4 = QueryBuilders.rangeQuery("createTime").from(begin.getTime()).to(end.getTime());
		//            query.must(query4);
		//        }
		return query;
	}

	/**
	 * 	增加物料信息
	 * @return 
	 * @throws IOException 
	 */
	public static String doAdd(MaterialView m) throws IOException {
		TransportClient client = ESClientUtil.getClient();

		XContentBuilder builder = XContentFactory.jsonBuilder().startObject()
				.field("brandCode", m.getBrandCode())
				.field("brandName", m.getBrandName())
				.field("equipmentName", m.getEquipmentName())
				.field("id", m.getId())
				.field("levelOneName", m.getLevelOneName())
				.field("levelOneCode", m.getLevelOneCode())
				.field("levelThreeName", m.getLevelThreeName())
				.field("levelThreeCode", m.getLevelThreeCode())
				.field("levelTwoName", m.getLevelTwoName())
				.field("levelTwoCode", m.getLevelTwoCode())
				.field("model", m.getModel())
				.field("paramInfo", m.getParamInfo())
				.field("supplierName", m.getSupplierName())
				.field("supplierId", m.getSupplierId())
				.field("type", m.getType())
				.field("remake", m.getRemake())
				.field("facePrice", m.getFacePrice())
				.field("designCost", m.getDesignCost())
				.field("purchaseCost", m.getPurchaseCost())
				.field("img", m.getImg())
				.field("createDate", m.getCreateDate())
				.endObject();
		IndexResponse response = client.prepareIndex(INDEX_NAME, TYPE_NAME, m.getId()).setSource(builder).get();
		System.err.println("保存结果------------------》"+response.status());
		//client.close();
		return response.status().toString();
	}

	/**
	 * 	修改物料信息
	 * @return 
	 * @throws IOException 
	 * @throws ExecutionException 
	 * @throws InterruptedException 
	 */
	public static String doUpdate(MaterialView m) throws IOException, InterruptedException, ExecutionException {
		TransportClient client = ESClientUtil.getClient();

		UpdateRequest request = new UpdateRequest();
		request.index(INDEX_NAME).type(TYPE_NAME).id(m.getId())
		.doc(
				XContentFactory.jsonBuilder().startObject()
				.field("brandCode", m.getBrandCode())
				.field("brandName", m.getBrandName())
				.field("equipmentName", m.getEquipmentName())
				.field("id", m.getId())
				.field("levelOneName", m.getLevelOneName())
				.field("levelOneCode", m.getLevelOneCode())
				.field("levelThreeName", m.getLevelThreeName())
				.field("levelThreeCode", m.getLevelThreeCode())
				.field("levelTwoName", m.getLevelTwoName())
				.field("levelTwoCode", m.getLevelTwoCode())
				.field("model", m.getModel())
				.field("paramInfo", m.getParamInfo())
				.field("supplierName", m.getSupplierName())
				.field("supplierId", m.getSupplierId())
				.field("type", m.getType())
				.field("remake", m.getRemake())
				.field("facePrice", m.getFacePrice())
				.field("designCost", m.getDesignCost())
				.field("purchaseCost", m.getPurchaseCost())
				.field("img", m.getImg())
				.field("createDate", m.getCreateDate())
				.endObject()
				);
		UpdateResponse response = client.update(request).get();

		//client.close();
		return response.status().toString();
	}

	/**
	 * 	删除物料
	 * @return 
	 */
	public static String doDel(String id) {
		TransportClient client = ESClientUtil.getClient();

		DeleteResponse response = client.prepareDelete(INDEX_NAME, TYPE_NAME, id).get();

		//client.close();

		return response.status().toString();
	}

	/**
	 * 	获取搜索结果相关的供应商信息
	 * @param keyword			搜索关键词-物料名称、详细参数、型号、规格、备注
	 * @param brandCodes		品牌CODES
	 * @param levelOneCode		一级分类CODE
	 * @param levelTwoCode		二级分类CODE
	 * @param levelThreeCode	三级分类CODE
	 * @return
	 */
	public static List<Map<String, Object>> getSuppliers(String keyword, String brandCodes,
			String levelOneCode, String levelTwoCode, String levelThreeCode) {

		TransportClient client = ESClientUtil.getClient();
		// 组织查询条件
		BoolQueryBuilder queryBuilder =
				setBoolQueryBuilder(keyword, brandCodes, null, levelOneCode, levelTwoCode, levelThreeCode);

		SearchResponse response = client.prepareSearch(INDEX_NAME)
				.setTypes(TYPE_NAME)
				// 排序
//				.addSort("createDate", SortOrder.DESC)
				// 执行检索的类别
				//.setSearchType(SearchType.DEFAULT)
				// 指定超时时间--1分钟
				.setScroll(TimeValue.timeValueMinutes(1))
				// 查询条件
				.setQuery(queryBuilder)
				// 大小
				.setSize(1000)
				.execute()
				.actionGet();
		Map<String, MaterialView> map = new HashMap<String, MaterialView>();
		List<Map<String, Object>> supps = new ArrayList<Map<String,Object>>();
		while(true){
			for (SearchHit hit : response.getHits().getHits()) {
				MaterialView dto = JSONObject.parseObject(hit.getSourceAsString(), MaterialView.class);

				if(!map.containsKey(dto.getSupplierId())) {
					map.put(dto.getSupplierId(), dto);
				}
			}

			//	        重置searchResponse 和ID
			String scrollId = response.getScrollId();
			
			response = client
					.prepareSearchScroll(scrollId)
					.setScroll(TimeValue.timeValueMinutes(1))
					.execute()
					.actionGet();

			if (response.getHits().getHits().length == 0) {
				break;
			}
		}
		
		//删除scroll
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(response.getScrollId());
        client.clearScroll(clearScrollRequest).actionGet();
		
		//保存结果
		for (String sid : map.keySet()) {
			Map<String, Object> resultMap = new HashMap<String, Object>();

			String name_str = map.get(sid).getSupplierName();
			if(!StringUtil.isNotEmpty(name_str)) {
				continue;
			}

			resultMap.put("value", name_str);
			resultMap.put("id", sid);


			String name_pinyin = "";
			try {

				String name_trim = StringUtil.replaceBlank(name_str);
				if(name_trim.length()>0) {
					name_pinyin = PinyinUtil.converterToFirstSpell(name_trim.substring(0,1));
				}else {
					name_pinyin = name_trim;
				}

			} catch (Exception e) {
				// TODO: handle exception
				System.err.println("供应商名称----------》"+map.get("value").toString().trim());
				e.printStackTrace();
			}

			resultMap.put("py", name_pinyin);

			supps.add(resultMap);
		}

		return supps;
	}
	
	/**
	 * 	获取搜索结果相关的品牌
	 * @param keyword			搜索关键词-物料名称、详细参数、型号、规格、备注
	 * @param supplierIds		供应商IDS
	 * @param levelOneCode		一级分类CODE
	 * @param levelTwoCode		二级分类CODE
	 * @param levelThreeCode	三级分类CODE
	 * @return
	 */
	public static List<Map<String, Object>> getBrands(String keyword, String supplierIds,
			String levelOneCode, String levelTwoCode, String levelThreeCode) {
		TransportClient client = ESClientUtil.getClient();
		System.err.println("1------------>"+DateUtil.formatDateTime(new Date()));
		// 组织查询条件
		BoolQueryBuilder queryBuilder =
				setBoolQueryBuilder(keyword, null, supplierIds, levelOneCode, levelTwoCode, levelThreeCode);

		SearchResponse response = client.prepareSearch(INDEX_NAME)
				.setTypes(TYPE_NAME)
				// 排序
//				.addSort("createDate", SortOrder.DESC)
				// 执行检索的类别
				//.setSearchType(SearchType.DEFAULT)
				// 指定超时时间--1分钟
				.setScroll(TimeValue.timeValueMinutes(1))
				// 查询条件
				.setQuery(queryBuilder)
				// 大小
				.setSize(1000)
				.execute()
				.actionGet();
		System.err.println("2------------>"+DateUtil.formatDateTime(new Date()));
		
		Map<String, MaterialView> map = new HashMap<String, MaterialView>();
		List<Map<String, Object>> brands = new ArrayList<Map<String,Object>>();
		while(true){
			for (SearchHit hit : response.getHits().getHits()) {
				MaterialView dto = JSONObject.parseObject(hit.getSourceAsString(), MaterialView.class);

				if(!map.containsKey(dto.getBrandCode())) {
					map.put(dto.getBrandCode(), dto);
				}
			}

			//	        重置searchResponse 和IDsetSize(1000)
			String scrollId = response.getScrollId();
			
			response = client
					.prepareSearchScroll(scrollId)
					.setScroll(TimeValue.timeValueMinutes(1))
					.execute()
					.actionGet();

			if (response.getHits().getHits().length == 0) {
				break;
			}
		}
		
		System.err.println("3------------>"+DateUtil.formatDateTime(new Date()));
		
		//删除scroll
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(response.getScrollId());
        client.clearScroll(clearScrollRequest).actionGet();
		
        System.err.println("4------------>"+DateUtil.formatDateTime(new Date()));
		//保存结果
		for (String bcode : map.keySet()) {
			Map<String, Object> resultMap = new HashMap<String, Object>();

			String name_str = map.get(bcode).getBrandName();
			if(!StringUtil.isNotEmpty(name_str)) {
				continue;
			}

			resultMap.put("typeName", name_str);
			resultMap.put("typeCode", bcode);

			String name_pinyin = "";
			try {

				String name_trim = StringUtil.replaceBlank(name_str);
				if(name_trim.length()>0) {
					name_pinyin = PinyinUtil.converterToFirstSpell(name_trim.substring(0,1));
				}else {
					name_pinyin = name_trim;
				}

			} catch (Exception e) {
				// TODO: handle exception
				System.err.println("供应商名称----------》"+map.get("value").toString().trim());
				e.printStackTrace();
			}

			resultMap.put("py", name_pinyin);

			brands.add(resultMap);
		}
		
		System.err.println("5------------>"+DateUtil.formatDateTime(new Date()));

		return brands;
	}
	
	public static void main(String[] args) {
		List<Map<String, Object>> res = getBrands(null, null, null, null, null);
		//List<Map<String, Object>> res = getSuppliers(null, null, null, null, null);
		System.err.println(res.size());
	}


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值