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,实现类
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;
}
}
6,controller类
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: