前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式搜索ElasticSearch构建集群与简单搜索实例应用

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

作者头像
星哥玩云
发布2022-07-04 14:22:46
3400
发布2022-07-04 14:22:46
举报
文章被收录于专栏:开源部署开源部署

关于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    资讯标题:中风可以用恩必普吗

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档