Elasticsearch5.4 Java编程注意事项

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就完成了,如有不懂可以联系我。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值