分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索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对应的目录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构建集群与简单搜索实例应用的更多相关文章
- Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈
目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...
- Elasticsearch跨集群搜索(Cross Cluster Search)
1.简介 Elasticsearch在5.3版本中引入了Cross Cluster Search(CCS 跨集群搜索)功能,用来替换掉要被废弃的Tribe Node.类似Tribe Node,Cros ...
- PB级数据实时查询,滴滴Elasticsearch多集群架构实践
PB级数据实时查询,滴滴Elasticsearch多集群架构实践 mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达 点 ...
- Elasticsearch之集群
ElasticSearch集群 ES集群是一个 P2P类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给 ...
- 谈一谈Elasticsearch的集群部署
Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...
- ES 30 - Elasticsearch生产集群的配置建议
目录 1 服务器的内存 2 服务器的CPU 3 服务器的磁盘 4 集群的网络 5 集群的节点个数 6 JVM的参数设置 7 集群的数据量 8 总结 在生产环境中, 要保证服务在各种极限情况下的稳定和高 ...
- 分布式架构学习-Consul集群配置
简介 之前公司用的是Consul进行服务发现以及服务管理,自己一直以来只是用一下,但是没有具体的深入,觉得学习不可以这样,所以稍微研究了一下. 网上有很多关于Consul的介绍和对比,我这里也不献丑了 ...
- Graylog+elasticsearch+mongodb集群+nginx负载均衡前端
网上有张图画的很好,搜索有关它的配置文章,google里有几篇英文的,都是依靠haproxy等或别的什么实现,没有纯粹的Graylog+elasticsearch+mongodb集群,项目需要,只有自 ...
- Elasticsearch 使用集群 - 创建和查询文档
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
随机推荐
- 谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN
声明: 1.这篇文章是原创.非复制或转载过来. 2.在本文中,参数都亲自做过实验证明. 3.这篇文章谈到了Hibernate配置基于注释的方法.hbm语法不可用. 不清JPA.Hibernate.EJ ...
- Effective C++之‘宁以pass-by-reference-to-const替换pass-by-value’
Effective C++之'宁以pass-by-reference-to-const替换pass-by-value' 缺省情况下C++以by value 方式(一个继承自C的方式)传递对象至函数.除 ...
- Android编码标准
只是练习是很难找工作那会儿在,简历基本上都是赶出去石沉大海,因为有项目开发没有实践经验.没有牛逼的背景.更重要的是,没有真才实学,虽然我在大学时读的是计算机专业,它可以被认为是一个技术教育.但--你知 ...
- Mac+PhpStorm+XAMPP+Xdebug
Mac+PhpStorm+XAMPP+Xdebug 环境的配置 在上一篇 PHP 系列的文章<PHP 集成开发环境比较>中,我根据自己的亲身体验,非常简略的介绍和对比了几款常用的集成开 ...
- 怎么会Sql serverW数据库模型图转化成ord于--您还可以查看属性信息字段
1. 于Sql server数据库,创建数据库模型图 -- Database Diagrams watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamN4NTA ...
- DOS批处理的字符串功能
原文:DOS批处理的字符串功能 DOS批处理的字符串功能 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理功能有:截取字符串内容.替换字符串特 ...
- MVC验证12-使用DataAnnotationsExtensions对整型、邮件、最小值、文件类型、Url地址等验证
原文:MVC验证12-使用DataAnnotationsExtensions对整型.邮件.最小值.文件类型.Url地址等验证 本文体验来自http://dataannotationsextension ...
- ASP.Net MVC请求处理流程
ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...
- Oralce 处理字符串函数
原文:Oralce 处理字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Ora ...
- SQL点滴27—性能分析之执行计划
原文:SQL点滴27-性能分析之执行计划 一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<I ...