阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

127次阅读
没有评论

共计 7224 个字符,预计需要花费 19 分钟才能阅读完成。

关于 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 对应的目录 elasticsearch\config\ 下的 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() +”\t 资讯标题:”+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() +”\t 资讯标题:”+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    资讯标题: 中风可以用恩必普吗

Elasticsearch 安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm

ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm

ElasticSearch 集群搭建实例  http://www.linuxidc.com/Linux/2015-02/114243.htm

分布式搜索 ElasticSearch 单机与服务器环境搭建  http://www.linuxidc.com/Linux/2012-05/60787.htm

ElasticSearch 的工作机制  http://www.linuxidc.com/Linux/2014-11/109922.htm

ElasticSearch 的详细介绍:请点这里
ElasticSearch 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计7224字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中