elasticsearch5.4.0 java开发注意事项

来源:互联网 发布:数据分析功能 编辑:程序博客网 时间:2024/05/22 12:37

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;@Configurationpublic 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.*; @Servicepublic 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:










原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不想去德育基地怎么办? 小学一年级成绩不好怎么办 初中军训来月经怎么办 ie网页无响应怎么办 ie9浏览器无响应怎么办 电脑没ie浏览器怎么办 ie浏览器删掉了怎么办 素质拓展分不够怎么办 想承包学校军训怎么办 军训完晒黑了怎么办 完美动力忽悠人怎么办 wlan密码忘了怎么办 孩子多动怎么办呢 孩子性格太内向怎么办 孩子脾气暴躁易怒怎么办 小孩有点叛逆应怎么办 小孩太叛逆怎么办关住 对不听话的孩子怎么办 孩子在学校不听话怎么办 孩子叛逆不回家怎么办 孩子厌学怎么办青春期叛逆 孩子青春期叛逆家长怎么办 孩子老哭不听话怎么办 8岁宝宝不听话怎么办 儿孑不听话叛逆怎么办 孩子太小不听话怎么办 得了只有很紧张怎么办 内向的妈妈孩子怎么办 对孩子没有耐心怎么办 孩子心理有问题怎么办 孩子心里有问题怎么办 父母打架我该怎么办 爸爸妈妈要离婚怎么办 父母吵架怎么办动手了 父母因为钱吵架怎么办 父母吵架孩子该怎么办 特别倔强的孩子怎么办 孩子胆小不自信怎么办 孩子不自信家长怎么办 二年级孩子厌学怎么办 儿童注意力不集中怎么办