分布式搜索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 资讯标题:中风可以用恩必普吗

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

热爱生活,热爱Coding,敢于挑战,用于探索 ...
 
标签: ElasticSearch

当前标签: ElasticSearch

 
苏若年 2013-09-29 18:52 阅读:200 评论:2
 

分布式搜索ElasticSearch构建集群与简单搜索实例应用的更多相关文章

  1. Docker 0x13: Docker 构建集群/服务/Compose/分布式服务栈

    目录 Docker 构建集群/服务/Compose/分布式服务栈 集群 初始化集群服务 安装docker-machine 管理节点和工作节点 docker集群构建完成 集群中部署应用 集群服务访问特性 ...

  2. Elasticsearch跨集群搜索(Cross Cluster Search)

    1.简介 Elasticsearch在5.3版本中引入了Cross Cluster Search(CCS 跨集群搜索)功能,用来替换掉要被废弃的Tribe Node.类似Tribe Node,Cros ...

  3. PB级数据实时查询,滴滴Elasticsearch多集群架构实践

    PB级数据实时查询,滴滴Elasticsearch多集群架构实践  mp.weixin.qq.com 点击上方"IT牧场",选择"设为星标"技术干货每日送达 点 ...

  4. Elasticsearch之集群

    ElasticSearch集群 ES集群是一个 P2P类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给 ...

  5. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  6. ES 30 - Elasticsearch生产集群的配置建议

    目录 1 服务器的内存 2 服务器的CPU 3 服务器的磁盘 4 集群的网络 5 集群的节点个数 6 JVM的参数设置 7 集群的数据量 8 总结 在生产环境中, 要保证服务在各种极限情况下的稳定和高 ...

  7. 分布式架构学习-Consul集群配置

    简介 之前公司用的是Consul进行服务发现以及服务管理,自己一直以来只是用一下,但是没有具体的深入,觉得学习不可以这样,所以稍微研究了一下. 网上有很多关于Consul的介绍和对比,我这里也不献丑了 ...

  8. Graylog+elasticsearch+mongodb集群+nginx负载均衡前端

    网上有张图画的很好,搜索有关它的配置文章,google里有几篇英文的,都是依靠haproxy等或别的什么实现,没有纯粹的Graylog+elasticsearch+mongodb集群,项目需要,只有自 ...

  9. Elasticsearch 使用集群 - 创建和查询文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

随机推荐

  1. Session与Caching

    Session与Caching 在之前的版本中,Session存在于System.Web中,新版ASP.NET 5中由于不在依赖于System.Web.dll库了,所以相应的,Session也就成了A ...

  2. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  3. 【高德地图API】从零开始学高德JS API(六)——坐标转换

    原文:[高德地图API]从零开始学高德JS API(六)——坐标转换 摘要:如何从GPS转到谷歌?如何从百度转到高德?这些都是小case.我们还提供,如何将基站cell_id转换为GPS坐标? --- ...

  4. vistual studio 2012 安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息

    在安装vistual studio 2012过程中,出现安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息 解决方法是更新相应的server补 ...

  5. 异常处理 Access to the path is denied

    在需要进行读写操作的目录下添加Network Service这个帐号, 由于在iis 6.0中,默认的应用程序池中的标示用的是Network Service, 所以在进程中是使用Network Ser ...

  6. CentOS-6.3安装配置SVN

    安装说明 系统环境:CentOS-6.3 安装方式:yum install (源码安装容易产生版本兼容的问题) 安装软件:系统自动下载SVN软件 检查已安装版本 #检查是否安装了低版本的SVN [ro ...

  7. 一步一步写算法(之挑选最大的n个数)

    原文:一步一步写算法(之挑选最大的n个数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 从一堆数据中挑选n个最大的数,这个问题是网上流传的 ...

  8. UiAutomator源码分析之UiAutomatorBridge框架

    上一篇文章<UIAutomator源码分析之启动和运行>我们描述了uitautomator从命令行运行到加载测试用例运行测试的整个流程,过程中我们也描述了UiAutomatorBridge ...

  9. 三个创建WebStorm项目的方法

    WebStorm项目代表一个完整的解决方案和定义项目范围设置.而重点则是代码完成.代码重构.代码风格等. 因此在建立项目时,WebStorm可以通过三个方面来完成:下载远程项目.复制控制存储库项目和直 ...

  10. [探索]点点轻博客搬家到WordPress(一)

    摘要:点点博客备份XML通过DiandianToWordpress-beta.sh(文末给出)搬家到Wordpress博客 本人曾使用过点点轻博客,也深知像点点博客,Lofter博客导出的XML文件不 ...