ElasticSearchHandler.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.yihu.quota.util;
  2. import com.yihu.quota.model.rest.FieldInfo;
  3. import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
  4. import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
  5. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
  6. import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
  7. import org.elasticsearch.action.admin.indices.exists.types.TypesExistsRequest;
  8. import org.elasticsearch.action.admin.indices.exists.types.TypesExistsResponse;
  9. import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
  10. import org.elasticsearch.client.Requests;
  11. import org.elasticsearch.client.transport.TransportClient;
  12. import org.elasticsearch.common.settings.Settings;
  13. import org.elasticsearch.common.transport.InetSocketTransportAddress;
  14. import org.elasticsearch.common.xcontent.XContentBuilder;
  15. import org.elasticsearch.common.xcontent.XContentFactory;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.stereotype.Component;
  20. import java.io.IOException;
  21. import java.net.InetAddress;
  22. import java.net.UnknownHostException;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. import java.util.Map;
  26. /**
  27. * Created by janseny on 2018/9/17.
  28. */
  29. @Component
  30. public class ElasticSearchHandler {
  31. private static Logger logger = LoggerFactory.getLogger(ElasticSearchHandler.class);
  32. @Value("${elasticsearch.cluster-name}")
  33. private String clusterName;
  34. @Value("${elasticsearch.cluster-nodes}")
  35. private String ip;
  36. /**
  37. * 取得实例
  38. * @return
  39. */
  40. public synchronized TransportClient getTransportClient() {
  41. TransportClient client = null ;
  42. try {
  43. Settings settings = Settings.builder().put("cluster.name", clusterName)
  44. /* .put("client.transport.sniff", true)*/
  45. .put("client.transport.ping_timeout", "30s").build();
  46. client = TransportClient.builder().settings(settings).build()
  47. .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), 9300));
  48. } catch (UnknownHostException e) {
  49. e.printStackTrace();
  50. }
  51. return client;
  52. }
  53. /**
  54. * 关闭连接
  55. * @param client es客户端
  56. */
  57. public void close(TransportClient client) {
  58. client.close();
  59. }
  60. /**
  61. * 为集群添加新的节点
  62. * @param nodeName
  63. * @param client es客户端
  64. */
  65. public synchronized void addNode(String nodeName,TransportClient client) {
  66. try {
  67. client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(nodeName), 9300));
  68. } catch (UnknownHostException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. /**
  73. * 删除集群中的某个节点
  74. * @param client es客户端
  75. * @param name
  76. */
  77. public synchronized void removeNode(String name,TransportClient client) {
  78. try {
  79. client.removeTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(name), 9300));
  80. } catch (UnknownHostException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. /**
  85. * 创建索引
  86. *
  87. * @param index 索引名称
  88. * @param client es客户端
  89. */
  90. public void createIndex(String index,TransportClient client) {
  91. CreateIndexRequest request = new CreateIndexRequest(index);
  92. client.admin().indices().create(request);
  93. }
  94. /**
  95. * 判断指定的索引名是否存在
  96. * @param indexName 索引名
  97. * @return 存在:true; 不存在:false;
  98. */
  99. public boolean isExistsIndex(String indexName,TransportClient client){
  100. IndicesExistsResponse response = client.admin().indices().exists(
  101. new IndicesExistsRequest().indices(new String[]{indexName})).actionGet();
  102. return response.isExists();
  103. }
  104. /**
  105. * 判断指定的索引的类型是否存在
  106. * @param indexName 索引名
  107. * @param indexType 索引类型
  108. * @return 存在:true; 不存在:false;
  109. */
  110. public boolean isExistsType(String indexName,String indexType,TransportClient client){
  111. TypesExistsResponse response = client.admin().indices()
  112. .typesExists(new TypesExistsRequest(new String[]{indexName}, indexType)).actionGet();
  113. return response.isExists();
  114. }
  115. /**
  116. * 创建mapping
  117. * @param index 索引
  118. * @param type 类型
  119. * @param client es客户端
  120. * @param xMapping mapping描述
  121. */
  122. public void createBangMapping(String index, String type, XContentBuilder xMapping,TransportClient client) {
  123. PutMappingRequest mapping = Requests.putMappingRequest(index).type(type).source(xMapping);
  124. client.admin().indices().putMapping(mapping).actionGet();
  125. }
  126. /**
  127. * 根据信息自动创建索引与mapping
  128. * 构建mapping描述 有问题
  129. * @param fieldInfoList
  130. * @param client es客户端
  131. * @return
  132. */
  133. public void createIndexAndCreateMapping(String index, String type,List<FieldInfo> fieldInfoList,TransportClient client) {
  134. XContentBuilder mapping = null;
  135. try {
  136. CreateIndexRequestBuilder cib = client.admin()
  137. .indices().prepareCreate(index);
  138. mapping = XContentFactory.jsonBuilder()
  139. .startObject().startObject("properties"); //设置之定义字段
  140. for(FieldInfo info : fieldInfoList){
  141. String field = info.getField();
  142. String dataType = info.getDataType();
  143. if(dataType == null || "".equals(dataType.trim())){
  144. dataType = "String";
  145. }
  146. dataType = dataType.toLowerCase();
  147. Integer participle = info.getParticiple();
  148. if("string".equals(dataType)){
  149. if(participle == 1) {
  150. mapping.startObject(field).field("type", "string").field("index", "not_analyzed").endObject();
  151. }else if(participle == 2) {
  152. mapping.startObject(field).field("type", "string").endObject();
  153. }
  154. }else if("date".equals(dataType)){
  155. mapping.startObject(field).field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject();
  156. }else if("nested".equals(dataType)){//子集属性
  157. mapping.startObject(field).field("type", "nested").startObject("properties");
  158. //子属性
  159. List<FieldInfo> childFieldList = info.getFieldInfos();
  160. for(FieldInfo child : childFieldList){
  161. String childField = child.getField();
  162. String childDataType = child.getDataType();
  163. int childParticiple = child.getParticiple();
  164. if("string".equals(childDataType)){
  165. if(childParticiple == 1) {
  166. mapping.startObject(childField).field("type", "string").field("index", "not_analyzed").endObject();
  167. }else if(childParticiple == 2) {
  168. mapping.startObject(childField).field("type", "string").endObject();
  169. }
  170. }else if("date".equals(dataType)){
  171. mapping.startObject(childField).field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject();
  172. }else {
  173. mapping.startObject(childField) .field("type", childDataType).endObject();
  174. }
  175. }
  176. mapping.endObject().endObject();
  177. }else {
  178. mapping.startObject(field) .field("type", dataType).endObject();
  179. }
  180. }
  181. mapping.endObject()
  182. .endObject();
  183. cib.addMapping(type, mapping);
  184. cib.execute().actionGet();
  185. } catch (IOException e) {
  186. System.out.println("创建索引发生异常");
  187. }
  188. }
  189. /**
  190. * 根据模板自动创建索引与mapping
  191. * @param index 索引字段
  192. * @param type 类型
  193. * @param client 客户端
  194. * @throws IOException
  195. */
  196. public void createMappingByTemplate(String index, String type,TransportClient client) throws IOException {
  197. CreateIndexRequestBuilder cib=client.admin()
  198. .indices().prepareCreate(index);
  199. XContentBuilder mapping = XContentFactory.jsonBuilder()
  200. .startObject()
  201. .startObject("properties") //设置之定义字段
  202. .startObject("id") .field("type", "integer").field("index", "not_analyzed").endObject()
  203. .startObject("classs").field("type", "integer").field("index", "not_analyzed").endObject()
  204. .startObject("score").field("type", "integer").field("index", "not_analyzed").endObject()
  205. //子属性
  206. .startObject("student")
  207. .startObject("properties")
  208. .startObject("name").field("type", "string").field("index", "not_analyzed").endObject()
  209. .startObject("age").field("type", "string").endObject()
  210. .endObject()
  211. .endObject()
  212. .startObject("updatetime").field("type", "date").field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis").endObject()
  213. .endObject()
  214. .endObject();
  215. cib.addMapping(type, mapping);
  216. cib.execute().actionGet();
  217. }
  218. }