栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Elasticsearch7学习笔记——RestHighLevelClient连接

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Elasticsearch7学习笔记——RestHighLevelClient连接

需要的JAR包

        
			org.elasticsearch
			elasticsearch
			7.14.2
		
		
			org.elasticsearch.client
			elasticsearch-rest-high-level-client
			7.14.2
		
		
			org.elasticsearch.client
			x-pack-transport
			7.14.2
		

实体类

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;
 

@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;
	}
 
	
	@Id
	@GeneratedValue(generator = "paymentableGenerator")
	@GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
	@Column(name = "ID", nullable = false, length = 36)
	public java.lang.String getId() {
		return this.id;
	}
 
	
	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;
	}
	
}

获取连接的工具类(开启了安全选项获取连接需要用户名密码信息)

import javax.servlet.http.HttpServletRequest;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;


public class ESRestClientUtil {

	//集群名称
	//private static final String CLUSTERNAME = "es-cluster";
	//ES服务器地址
	//private static final String IP = "192.168.0.119";
	//ES服务器端口--elastic search默认tcp端口9300,http端口9200
	private static final Integer PORT = 9200;
	//通讯方式
	private static final String SCHEME = "http";

	//用户名
	private static final String USERNAME = "elastic";
	//密码
	private static final String PASSWORD = "123456";

	public static RestHighLevelClient getClient(HttpServletRequest req) {
		RestHighLevelClient client = null;

		final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
		credentialsProvider.setCredentials(AuthScope.ANY,
				new UsernamePasswordCredentials(USERNAME, PASSWORD));

		try {
			String ip = "192.168.0.119";//服务器地址 
			client = new RestHighLevelClient(RestClient.builder(new HttpHost(ip, PORT, SCHEME))
					.setHttpClientConfigCallback(new HttpClientConfigCallback() {
						@Override
						public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
							// TODO Auto-generated method stub
							return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
						}
					}));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return client;
	}

}

CRUD操作

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

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.core.Timevalue;
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.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.ScoreSortBuilder;
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 com.alibaba.fastjson.JSONObject;
import com.jeecg.yw.entity.MaterialView;


public class ESRestMaterialUtil {

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

	
	public static AjaxJson createIndex(HttpServletRequest req) throws Exception {
		AjaxJson j = new AjaxJson();

		RestHighLevelClient client = ESRestClientUtil.getClient(req);

		XContentBuilder builder = XContentFactory.jsonBuilder()
				.startObject()
				.startObject("properties")
				.startObject("id")
				.field("type", "keyword")
				.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()
				.startObject("mspId")
				.field("type", "text")
				.field("store", true)
				.endObject()
				.endObject()
				.endObject();

		//创建索引请求
		CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);
		//设置分片和副本数
		request.settings(Settings.builder()
				.put("number_of_shards", 3)
				.put("number_of_replicas", 0)
				//修改查询最大条数
				//.put("max_result_window", 10000000)
				);
		//创建映射,中间填写需要存到ES上的JavaDTO对象对应的JSON数据。
		request.mapping(builder);
		//创建索引
		CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);

		client.close();

		j.setObj(createIndexResponse.isShardsAcknowledged());
		return j;
	}

	
	public static AjaxJson synchronizeData(HttpServletRequest req, List list) throws Exception {
		AjaxJson j = new AjaxJson();
		j.setMsg("同步物料数量:"+doAddList(req, list));
		return j;
	}

	
	public static int doAddList(HttpServletRequest req, List list) throws Exception{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);

		//第三种方式: XContentBuilder automatically converted to JSON

		int num = 0;
		for (MaterialView m : list) {

			num++;

			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())
					.field("mspId", m.getMspId())
					.endObject();
			
			IndexRequest indexRequest1 = new IndexRequest(INDEX_NAME).id(m.getId()).source(builder);
//			IndexRequest indexRequest1 = new IndexRequest(INDEX_NAME, TYPE_NAME, m.getId())
//					.source(builder);

			//同步执行
			client.index(indexRequest1, RequestOptions.DEFAULT);

		}
		client.close();

		return num;
	}

	
	public static String doAdd(HttpServletRequest req, MaterialView m) throws Exception{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);

		//第三种方式: XContentBuilder automatically converted to JSON

		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())
				.field("mspId", m.getMspId())
				.endObject();

//		IndexRequest indexRequest1 = new IndexRequest(INDEX_NAME, TYPE_NAME, m.getId())
//				.source(builder);
		IndexRequest indexRequest1 = new IndexRequest(INDEX_NAME).id(m.getId()).source(builder);

		//同步执行
		IndexResponse indexResponse = client.index(indexRequest1, RequestOptions.DEFAULT);

		client.close();
		return indexResponse.status().toString();
	}

	
	public static void get(HttpServletRequest req, String id) throws Exception{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);

//		GetRequest request = new GetRequest(INDEX_NAME, TYPE_NAME, id);
		GetRequest request = new GetRequest(INDEX_NAME).id(id);
		//同步执行
		client.get(request, RequestOptions.DEFAULT);

		client.close();

	}

	
	public static void doDelete(HttpServletRequest req, String id) throws Exception{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);
//		DeleteRequest request = new DeleteRequest(INDEX_NAME, TYPE_NAME, id);
		
		DeleteRequest request = new DeleteRequest(INDEX_NAME).id(id);

		//同步执行
		client.delete(request, RequestOptions.DEFAULT);

		client.close();

	}

	
	public static void doUpdate(HttpServletRequest req, MaterialView m) throws Exception{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);
		UpdateRequest request = //new UpdateRequest(INDEX_NAME, TYPE_NAME, m.getId());
		new UpdateRequest(INDEX_NAME, m.getId());

		request.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())
				.field("mspId", m.getMspId())
				.endObject()
				);

		//同步执行
		UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT);
		//update Response
		updateResponse.getGetResult();

		client.close();

	}

	

	public static PageUtil doPage(HttpServletRequest req, PageUtil page, String keyword, String brandCodes, String supplierIds,
			String levelOneCode, String levelTwoCode, String levelThreeCode) throws IOException {

		RestHighLevelClient client = ESRestClientUtil.getClient(req);
		//1,构建SearchRequest请求对象,指定索引库
		SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
		//2,构建SearchSourceBuilder查询对象
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
		sourceBuilder.trackTotalHits(true);//设置查询全部
		//3,构建QueryBuilder对象指定查询方式和查询条件
		BoolQueryBuilder query = setBoolQueryBuilder(keyword, brandCodes, supplierIds, levelOneCode, levelTwoCode, levelThreeCode);
		//4,将QuseryBuilder对象设置到SearchSourceBuilder对象中
		sourceBuilder.query(query);

		//字段过滤
		sourceBuilder.fetchSource(
				new String[]{"brandName","equipmentName","id","levelOneName","levelTwoName","levelThreeName","model",
						"paramInfo","supplierName","type","remake","facePrice","designCost","purchaseCost","img", "mspId"},
				new String[]{"brandCode", "levelOneCode", "levelTwoCode", "levelThreeCode", "supplierId", "createDate"}
				);
		//排序
		//Specifying Sorting 指定排序
		sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
		sourceBuilder.sort(new FieldSortBuilder("id").order(SortOrder.DESC));

		int pageSize = page.getRows();
		int currentPageNo = page.getPage();

		List result = new ArrayList<>(pageSize);

		//分页
		sourceBuilder.from((currentPageNo - 1) * pageSize);
		sourceBuilder.size(pageSize);

		//5,将SearchSourceBuilder设置到SearchRequest中
		searchRequest.source(sourceBuilder);

		// 设置高亮属性
		// 高亮设置
		HighlightBuilder highlightBuilder = new HighlightBuilder();
		highlightBuilder.requireFieldMatch(false)
		.field("equipmentName")
		.field("paramInfo")
		.field("model")
		.field("remake")
		.field("type")
		.field("supplierName")
		.field("brandName")
		//开启匹配指定字段高亮--默认false
		.requireFieldMatch(true)
		.preTags("").postTags("");

		sourceBuilder.highlighter(highlightBuilder);

		try {
			//6,调用方法查询数据
			SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

			// 获取查询总数量
			Long totalCount = searchResponse.getHits().getTotalHits().value;
			// 设置分页数据总数
			page.setTotal(totalCount.intValue());

			// 查询总数量为0,直接返回
			if (totalCount == 0) {
				page.setResults(result);
				return page;
			}
			// 获取分页结果
			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 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 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);
			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		//封装结果
		List> resultList = new ArrayList<>();
		for (MaterialView mat : result) {
			Map material = new HashMap();
			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());
			material.put("mspId", mat.getMspId());
			material.put("facePrice", mat.getFacePrice());
			material.put("designCost", mat.getDesignCost());
			material.put("purchaseCost", mat.getPurchaseCost());

			Map 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);

		client.close();

		return page;
	}

	
	private static List doScroll(HttpServletRequest req, String keyword, String brandCodes, String supplierIds,
			String levelOneCode, String levelTwoCode, String levelThreeCode) throws IOException{

		RestHighLevelClient client = ESRestClientUtil.getClient(req);
		//初始化scroll
		final Scroll scroll = new Scroll(new Timevalue(60000L)); //设定滚动时间间隔
		SearchRequest searchRequest = new SearchRequest();
		searchRequest.scroll(scroll);
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

		// 组织查询条件
		BoolQueryBuilder queryBuilder = setBoolQueryBuilder(keyword, brandCodes, supplierIds, levelOneCode, levelTwoCode, levelThreeCode);

		searchSourceBuilder.query(queryBuilder);
		searchSourceBuilder.size(10000); //设定每次返回多少条数据
		searchRequest.source(searchSourceBuilder);

		SearchResponse response = null;
		try {
			response = client.search(searchRequest, RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
		}

		List materialViews = new ArrayList();
		while(true){
			for (SearchHit hit : response.getHits().getHits()) {
				MaterialView dto = JSONObject.parseObject(hit.getSourceAsString(), MaterialView.class);
				materialViews.add(dto);
			}
			//	        重置searchResponse 和ID
			String scrollId = response.getScrollId();

			SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
			scrollRequest.scroll(scroll);
			try {
				response = client.scroll(scrollRequest, RequestOptions.DEFAULT);
			} catch (IOException e) {
				e.printStackTrace();
			}

			if (response.getHits().getHits().length == 0) {
				break;
			}
		}
		//清除滚屏
		ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
		clearScrollRequest.addScrollId(response.getScrollId());//也可以选择setScrollIds()将多个scrollId一起使用
		//ClearScrollResponse clearScrollResponse = null;
		try {
			//clearScrollResponse = 
			client.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//boolean succeeded = clearScrollResponse.isSucceeded();

		client.close();

		return materialViews;
	}

	
	public static List> getSuppliers(HttpServletRequest req, String keyword, String brandCodes, 
			String levelOneCode, String levelTwoCode, String levelThreeCode) throws IOException{

		List materialViews = doScroll(req, keyword, brandCodes, null, levelOneCode, levelTwoCode, levelThreeCode);

		Map map = new HashMap();
		for (MaterialView mv : materialViews) {
			if(!map.containsKey(mv.getSupplierId())) {
				map.put(mv.getSupplierId(), mv);
			}
		}

		List> supps = new ArrayList>();

		//保存结果
		for (String sid : map.keySet()) {
			Map resultMap = new HashMap();

			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;
	}

	
	public static List> getBrands(HttpServletRequest req, String keyword, String supplierIds,
			String levelOneCode, String levelTwoCode, String levelThreeCode) throws IOException{

		List materialViews = doScroll(req, keyword, null, supplierIds, levelOneCode, levelTwoCode, levelThreeCode);

		Map map = new HashMap();
		for (MaterialView mv : materialViews) {
			if(!map.containsKey(mv.getBrandCode())) {
				map.put(mv.getBrandCode(), mv);
			}
		}

		List> brands = new ArrayList>();
		//保存结果
		for (String bcode : map.keySet()) {
			Map resultMap = new HashMap();

			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);
		}
		return brands;
	}

	
	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", 
					"supplierName", 
					"brandName", 
					"type")
					//minmum_should_match为百分之百的时候,效果等同于operator为and的情况
					.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;
	}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号