1,集群配置
1).node.master: true 指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。
2).node.data: true 指定该节点是否存储索引数据,默认为true。
4.master和data同时配置会产生一些奇异的效果:
1) 当master为false,而data为true时,会对该节点产生严重负荷; 需要提供一个性能比较好的机器
2) 当master为true,而data为false时,该节点作为一个协调者;
3) 当master为false,data也为false时,该节点就变成了一个负载均衡器。
属性:discovery.zen.minimum_master_nodes: 2
了解Zookeeper的话,这个配置就比较容易理解了; 数值取值为 (有资格当选为Master的节点个数/2+1), 这样做是为了防止脑裂现象, 防止某些主节点自成一个集群. 考虑到Zookeeper的一些配置, 主节点的个数最好是奇数个,并且不少于3个;但是会带来一个问题,如必须至少一半以上的主节点是可用的,如果不能满足这个要求,则系统就会崩溃.
注意:集群机器最好设置成2*n+1,这样设置的好处就是挂掉一半机器集群不会死掉。因为到了一半,ES集群就会挂掉。一般三台,五台,七台等等。
java开发:
由于ES版本对于java的要求比较严格,所以在服务器上的ES版本是多少,在pom文件中就引入版本多少的ES版本。
由于我是springboot开发,所以就举个例子。
1,pom.xml引入相关的jar包
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.4.0</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.4.0</version> </dependency>还需要导入相应的log4j
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency>2,application.properties
spring.data.elasticsearch.cluster-nodes=xxx.xxx.xx.xx:9300 #你自己的服务器ip和端口号 spring.data.elasticsearch.cluster-name=elasticsearch #集群的名称3,服务器启动加载类设置,主要是连接ES,不需要每次都连接,直接放在内存中就ok
package com.qz.quickSearch.clientConfig; import org.apache.log4j.Logger; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import java.net.InetAddress; import java.net.UnknownHostException; @Configuration public class ElasticsearchConfiguration implements FactoryBean<TransportClient>, InitializingBean, DisposableBean { Logger logger = Logger.getLogger(ElasticsearchConfiguration.class); @Value("${spring.data.elasticsearch.cluster-nodes}") //获取集群节点 private String clusterNodes; @Value("${spring.data.elasticsearch.cluster-name}")//获取集群名称 private String clusterName; private TransportClient client; @Override public void destroy() throws Exception {//销毁client try { logger.info("Closing elasticSearch client"); if (client != null) { client.close(); } } catch (final Exception e) { logger.error("Error closing ElasticSearch client: ", e); } } @Override public TransportClient getObject() throws Exception { return client; } @Override public Class<TransportClient> getObjectType() { return TransportClient.class; } @Override public boolean isSingleton() { return false; } @Override public void afterPropertiesSet() throws Exception { buildClient(); } //创建client protected void buildClient() { try { PreBuiltTransportClient preBuiltTransportClient = new PreBuiltTransportClient(settings()); System.out.println("clusterNodes:" + clusterNodes); if (!"".equals(clusterNodes)) { for (String nodes : clusterNodes.split(",")) { String InetSocket[] = nodes.split(":"); String Address = InetSocket[0]; Integer port = Integer.valueOf(InetSocket[1]); preBuiltTransportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(Address), port)); } client = preBuiltTransportClient; System.out.println("client" + client); } } catch (UnknownHostException e) { logger.error(e.getMessage()); System.out.println("连接错误"); } } //设置集群名称seetings private Settings settings() { Settings settings = Settings.builder() .put("cluster.name", clusterName).build(); client = new PreBuiltTransportClient(settings); System.out.println("clusterName:" + clusterName); return settings; } }4,调用service接口
package com.qz.quickSearch.service; public interface SearchService { String search(String value); }5,实现类
6,controller类package com.qz.quickSearch.service.impl; import com.qz.quickSearch.clientConfig.ElasticsearchConfiguration; import com.qz.quickSearch.service.SearchService; import com.qz.quickSearch.utils.Constant; import com.qz.quickSearch.utils.JsonConvert; import com.qz.quickSearch.utils.MessageBean; import org.apache.log4j.Logger; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.SimpleQueryStringBuilder; import org.elasticsearch.index.query.WildcardQueryBuilder; import org.elasticsearch.search.SearchHit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.*; @Service public class SearchServiceImpl implements SearchService { Logger logger = Logger.getLogger(SearchServiceImpl.class); @Autowired ElasticsearchConfiguration elasticsearchConfiguration; String json = null; /** * demo,模糊查询 * @param value * @return */ @Override public String search(String value) { try { if (!StringUtils.isEmpty(value)) { TransportClient client = elasticsearchConfiguration.getObject(); WildcardQueryBuilder wqb = QueryBuilders.wildcardQuery("message", "*" + value + "*"); // SimpleQueryStringBuilder sqs = QueryBuilders.simpleQueryStringQuery(value); SearchResponse response = client.prepareSearch().setQuery(wqb).setFrom(0).setSize(1000).execute().actionGet(); Iterator<SearchHit> iterator = response.getHits().iterator(); Map<String, String> mm = new HashMap<String, String>(); List<Map> list = new ArrayList<Map>(); while (iterator.hasNext()) { Map<String, Object> map = iterator.next().getSource(); // mm.put("id", iterator.next().getId()); mm.put("message", map.get("message").toString()); list.add(mm); } if (list.size() > 0) { json = JsonConvert.convertToJson(new MessageBean(true, JsonConvert.convertToJson(list))); } else { json = JsonConvert.convertToJson(new MessageBean(false , Constant.SEARCH_NO_DATA)); } } } catch (Exception e) { logger.error(Constant.SEARCH_FALSE, e); json = JsonConvert.convertToJson(new MessageBean(false , Constant.SEARCH_FALSE)); } return json; } }
package com.qz.quickSearch.controller; import com.qz.quickSearch.service.SearchService; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/index") public class SearchController { Logger logger = Logger.getLogger(SearchController.class); @Autowired SearchService searchService; @RequestMapping("/search_{value}") @ResponseBody public String search(@PathVariable("value") String value) { return searchService.search(value); } }
7,页面html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <link rel="stylesheet" href="/css/bootstrap.min.css"/> <script type="text/javascript" src="/js/jquery.min.js"></script> <script type="text/javascript" src="/js/bootstrap.min.js"></script> <script src="/js/utils.js"></script> <script src="/js/index.js"></script> <title>潜智搜索</title> </head> <body> <div style="margin-left: 30%;margin-top: 15%;"> <div class="row"> <div class="col-lg-6"> <div class="input-group"> <input type="text" class="form-control" id="searchText"/> <span class="input-group-btn"> <button class="btn btn-default" type="button" id="search">Go!</button> </span> </div> </div> </div> </div> <div id="docTxt"> </div> <script type="text/javascript"> index.init(); </script> </body> </html>8,对应的index.js
index=function(){ var search=function(){ var text=$("#searchText").val(); var url="/index/search_"+text; $.ajax({ type:"post", url:url, dataType:'json', success:function (data) { $("#docTxt").empty(); if(data.success){ var dts=eval(data.message); if(dts.length>0){ for(var i=0;i<dts.length;i++){ var doc=$("<a href='javascript:;' id='"+dts[i].message+"'>"+dts[i].message+"</a></br>"); $("#docTxt").append(doc); } }else{ alert(data.message); } }else{ alert(data.message); } }, failure:function(data){ alert(data); } }); }; return { init:function(){ $("#search").bind("click",function(){ search(); }); $("#searchText").bind("keydown",function(e){ if(e.keyCode==13){ search(); //处理事件 } }); } } }();至此,一个简单的demo就完成了,如有不懂可以联系我。
wechat: