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

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

397次阅读
没有评论

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

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7971026
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的3D玩偶了

终于收到了以女儿为原型打印的 3D 玩偶了 前些日子参加某网站活动,获得一次实物 3D 打印的机会,于是从众多...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...