• 分布式搜索ElasticSearch构建集群与简单搜索实例应用


    关于ElasticSearch不介绍了,直接说应用.

    分布式ElasticSearch集群构建的方法.

    1.通过在程序中创建一个嵌入es节点(Node),使之成为es集群的一部分,然后通过这个节点来与es集群通信.

    /**在运行该测试实例时,已经在本地建立了对应的索引库datum*/
        public static void main(String[] args) {
            
            //当你启动一个节点,它会自动加入同网段的es集群,一个前提就是es的集群名(cluster.name)这个参数要设置一致。
            String clusterName = "elasticsearch_pudp"; //集群结点名称
            
            /**
             * 默认的话启动一个节点,es集群会自动给它分配一些索引的分片,如果你想这个节点仅仅作为一个客户端而不去保存数据,
             * 你就可以设置把node.data设置成false或 node.client设置成true。
             */
            Node node = NodeBuilder.nodeBuilder().clusterName(clusterName).client(true).node(); 
            
            //启动结点,加入到指定集群
            node.start();
            
            //获取节点搜索端,使用prepareGet搜索datum索引库中 索引类型为datum,的索引记录唯一id值为150得记录
            GetResponse response = node.client().prepareGet("datum", "datum", ""+150).execute().actionGet();
            
            //对象映射模型
            ObjectMapper mapper = new ObjectMapper();
            //将搜索结果response中的值转换成指定的对象模型,Datum是自己建立的一个咨询Model对象
            Datum datum= mapper.convertValue(response.getSource(), Datum.class);
            
            //打印检索结果中获取的对象相应的属性
            System.out.println("资讯标题:"+datum.getTitle() );
            
            //关闭结点
            node.close();
        }

    程序运行结果:

    资讯标题:波立维与泰嘉片哪个治疗血栓病效果更好呢

    还有一种情况是你并不想把节点加入集群,只想用它进行单元测试时,就要启动一个”本地”的es,这里“本地”指的是在jvm的级别下运行,即两个不同的es节点运行在同一个JVM中时会组成一个集群。它需要把节点的local参数设置成true

    Node node = NodeBuilder.nodeBuilder().local(true).node(); 

      

    2.用TransportClient这个接口和es集群通信.

    集群中绑定结点

    通过TransportClient这个接口,我们可以不启动节点就可以和es集群进行通信,它需要指定es集群中其中一台或多台机的ip地址和端口

            Client client = new TransportClient()
            .addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300))
            .addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300));
        
            client.close();    

    集群名称如果我们不更改,默认的为elasticsearch,ElasticSearch对应的目录elasticsearchconfig下的elasticsearch.yml文件中.如下位置 

    ################################### Cluster ###################################
    
    # Cluster name identifies your cluster for auto-discovery. If you're running
    # multiple clusters on the same network, make sure you're using unique names.
    #
    cluster.name: elasticsearch

     

    程序中自定义集群结点名称

        /**在运行该测试实例时,已经在本地建立了对应的索引库datum*/
        public static void main(String[] args) {
            
            //自定义集群结点名称
            String clusterName = "elasticsearch_pudongping"; 
            
            //程序中更改集群结点名称
            Settings settings = ImmutableSettings.settingsBuilder()
            .put("cluster.name", clusterName).build();
            
            //创建集群,绑定集群内的机器
            TransportClient client = new TransportClient(settings);
            client.addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300));
            client.addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300));
            
            //搜索
            GetResponse response = client.prepareGet("datum", "datum", ""+130)
              .execute()
              .actionGet();
            
            ObjectMapper mapper = new ObjectMapper();
            Datum datum= mapper.convertValue(response.getSource(), Datum.class);
            
            System.out.println("资讯标题:"+datum.getTitle() );
            
            //关闭结点
            client.close();    
        }

    程序运行结果:

    资讯标题:捷诺维主要成份有哪些 疗效怎么样

    设置属性使客户端去嗅探整个集群的状态

    可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态

            /**
             * 可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,
             * 把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,
             * 它会自动帮你添加,并且自动发现新加入集群的机器。
             */
            Settings settings = ImmutableSettings.settingsBuilder()
            .put("client.transport.sniff", true).build();
            TransportClient client = new TransportClient(settings);

     

    实例应用: 

    使用TransportClient初始化客户端并执行简单搜索:

    package com.bbf.client;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import org.codehaus.jackson.map.ObjectMapper;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.ImmutableSettings;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.InetSocketTransportAddress;
    import org.elasticsearch.index.query.QueryBuilder;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.search.SearchHit;
    import org.elasticsearch.search.SearchHits;
    import com.bbf.search.model.Datum;
    
    /**
     * description:
     *
     * @author <a href='mailto:dennisit@163.com'> Cn.pudp (En.dennisit)</a> Copy Right since 2013-9-29 
     *
     * com.bbf.client.ESClient.java
     *
     */
    
    public class ESClient {
    
        
        /**在运行该测试实例时,已经在本地建立了对应的索引库datum*/
        public static void main(String[] args) {
            
            
            //自定义集群结点名称
            String clusterName = "elasticsearch_pudongping"; 
            
            //程序中更改集群结点名称 并且设置client.transport.sniff为true来使客户端去嗅探整个集群的状态
            Settings settings = ImmutableSettings.settingsBuilder()
            .put("cluster.name", clusterName).put("client.transport.sniff", true).build();   
            
            //创建客户端对象
            TransportClient client = new TransportClient(settings);
            
            //客户端对象初始化集群内结点,绑定多个ip
            //client.addTransportAddress(new InetSocketTransportAddress("192.168.0.149", 9300));
            client.addTransportAddress(new InetSocketTransportAddress("192.168.0.162", 9300));
            
            
            //搜索,根据Id查询
            GetResponse response = client.prepareGet("datum", "datum", ""+130)
              .execute()
              .actionGet();
            
            //查询结果映射成对象类
            ObjectMapper mapper = new ObjectMapper();
            Datum datum= mapper.convertValue(response.getSource(), Datum.class);
            
            System.out.println("资讯编号:" + datum.getId() +"	资讯标题:"+datum.getTitle()  );
            
            //构造查询器查询,第一个参数为要查询的关键字,第二个参数为要检索的索引库中的对应索引类型的域
            QueryBuilder query = QueryBuilders.multiMatchQuery("恩必普", "keyword");  
            //第一个参数datum表示索引库,第二个参数datum表示索引类型,from表示开始的位置 size表示查询的条数 ,类似mysql中的limit3,5
            SearchResponse searchResponse = client.prepareSearch("datum").setTypes("datum").setQuery(query).setFrom(3).setSize(5).execute().actionGet(); 
            
     
            //将搜索结果转换为list集合对象
            List<Datum> lists  = getBeans(searchResponse);
            
            System.out.println("查询出来的结果数:" + lists.size());
            for(Datum dtm: lists){
                System.out.println("资讯编号:" + dtm.getId() +"	资讯标题:"+dtm.getTitle());
            }
            
            //关闭客户端
            client.close();    
    
        }
        
        /**
         * 从查询到的记录中获取json串值,转换成<code>Datum</code>对象
         *
         * @author <a href='mailto:dennisit@163.com'> Cn.pudp (En.dennisit)</a> Copy Right since 2013-9-24 下午09:24:29
         *                
         * @param response
         *                     查询结果集<code>GetResponse</code>
         * @return
         *                     返回<code>Datum</code>对象
         */
        public static Datum getResponseToObject(GetResponse response){
            ObjectMapper mapper = new ObjectMapper();
            return mapper.convertValue(response.getSource(), Datum.class);
        }
        
        
        /**
         * 将查询到的对象集合封装成List集合
         *
         * @author <a href='mailto:dennisit@163.com'>Cn.pudp(En.dennisit)</a> Copy Right since 2013-9-27 下午02:31:26
         *                
         * @param  response
         * @return
         */
        public static List<Datum> getBeans(SearchResponse response) {
            SearchHits hits = response.getHits();
            ObjectMapper mapper = new ObjectMapper();
            List<Datum> datumList = new ArrayList<Datum>();
            for (SearchHit hit : hits) {  
                String json = hit.getSourceAsString();
                Datum dtm = new Datum();
               
                try {
                    dtm = mapper.readValue(json, Datum.class);
                    datumList.add(dtm);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
            }
            return datumList;
        }
        
    }

     程序运行结果:

    资讯编号:130    资讯标题:捷诺维主要成份有哪些 疗效怎么样
    查询出来的结果数:5
    资讯编号:16    资讯标题:恩必普是不是医保药 可以报销吗
    资讯编号:11    资讯标题:恩必普的治疗范围  有什么优势
    资讯编号:17    资讯标题:恩必普的作用机制是什么
    资讯编号:12    资讯标题:恩必普服用有什么禁忌 注意事项哪些
    资讯编号:20    资讯标题:中风可以用恩必普吗

     转载请注明出处:[http://www.cnblogs.com/dennisit/p/3346228.html]

  • 相关阅读:
    Got05
    Git07
    Git09
    Git11
    Git10
    Git13
    Git12
    Git14
    Listview点击跳转页面
    《三个和尚》观后感
  • 原文地址:https://www.cnblogs.com/dennisit/p/3346228.html
Copyright © 2020-2023  润新知