加入依赖

我本地的Elasticsearch的版本是2.1.0,因此加入相应的maven依赖

<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.1.0</version>
</dependency>

创建Client

Elasticsearch Client分为Node Client和TransportClient。

  • Node Client:节点本身也是Elasticsearch集群的节点,也进入Elasticsearch集群和别的Elasticsearch集群中的节点一样
  • TransportClient:轻量级的Client,使用Netty线程池,Socket连接到ES集群。本身不加入到集群,只作为请求的处理

一般我们使用TransportClient。创建Client的实例如下:

	private TransportClient client = null;

    @Before
public void createElaCLient() throws UnknownHostException {
//如果集群是默认名称的话可以不设置集群名称
Settings settings = Settings.settingsBuilder().put("cluster.name","elasticsearch").build();
client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("master"),9300));
} /**
* 关闭ela客户端
*/
@After
public void closeElaClient(){
if(client != null){
client.close();
}
}

client.transport.sniff嗅探功能

你可以设置client.transport.sniff为true来使客户端去嗅探整个集群的状态,把集群中其它机器的ip地址加到客户端中,这样做的好处是一般你不用手动设置集群里所有集群的ip到连接客户端,它会自动帮你添加,并且自动发现新加入集群的机器。代码实例如下:

	private TransportClient client = null;

    @Before
public void createElaCLient() throws UnknownHostException {
//如果集群是默认名称的话可以不设置集群名称
Settings settings = Settings.settingsBuilder().put("cluster.name","elasticsearch").put("client.transport.sniff",true).build();
client = TransportClient.builder().settings(settings).build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("master"),9300));
}

注意:当ES服务器监听使用内网服务器IP而访问使用外网IP时,不要使用client.transport.sniff为true,在自动发现时会使用内网IP进行通信,导致无法连接到ES服务器,而直接使用addTransportAddress方法进行指定ES服务器

测试Client连接到Elasticsearch集群

代码如下:

@Test
public void testConnection(){
List<DiscoveryNode> discoveryList = client.connectedNodes();
for(DiscoveryNode node : discoveryList){
System.out.println(node.getName());
}
}

创建/删除Index和Type信息

	/**
* 创建索引
*/
@Test
public void createIndex(){
if(client != null){
client.admin().indices().create(new CreateIndexRequest("test_index")).actionGet();
}
} /**
* 清除索引
*/
@Test
public void clearIndex(){
IndicesExistsResponse indicesExistsResponse = client.admin().indices().exists(new IndicesExistsRequest("test_index")).actionGet();
if(indicesExistsResponse.isExists()){
client.admin().indices().delete(new DeleteIndexRequest("test_index")).actionGet();
}
} /**
* 定义索引的映射类型(mapping)
*/
@Test
public void defineIndexTypeMapping(){
try {
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject()
.startObject("test")
.startObject("properties")
.startObject("id").field("type","long").field("store","yes").endObject()
.startObject("name").field("type","string").field("store","yes").field("index","not_analyzed").endObject()
.endObject()
.endObject()
.endObject();
PutMappingRequest mappingRequest = Requests.putMappingRequest("test_index").type("test").source(builder);
client.admin().indices().putMapping(mappingRequest).actionGet();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 删除index下的某个type
*/
@Test
public void deleteType(){
if(client != null){
client.prepareDelete().setIndex("test_index").setType("test").execute().actionGet();
}
}

这里自定义了某个Type的索引映射(Mapping),默认ES会自动处理数据类型的映射:针对整型映射为long,浮点数为double,字符串映射为string,时间为date,true或false为boolean。

注意:针对字符串,ES默认会做“analyzed”处理,即先做分词、去掉stop words等处理再index。如果你需要把一个字符串做为整体被索引到,需要把这个字段这样设置:field(“index”, “not_analyzed”)。

索引数据

	/**
* 批量索引
*/
@Test
public void indexData(){
BulkRequestBuilder requestBuilder = client.prepareBulk();
for(Person person : personList){
String obj = getIndexDataFromHotspotData(person);
if(obj != null){
requestBuilder.add(client.prepareIndex("test_index","test",String.valueOf(person.getId())).setRefresh(true).setSource(obj));
}
}
BulkResponse bulkResponse = requestBuilder.execute().actionGet();
if(bulkResponse.hasFailures()){
Iterator<BulkItemResponse> it = bulkResponse.iterator();
while(it.hasNext()){
BulkItemResponse itemResponse = it.next();
if(itemResponse.isFailed()){
System.out.println(itemResponse.getFailureMessage());
}
}
}
} /**
* 单个索引数据
* @return
*/
@Test
public void indexHotspotData() {
String jsonSource = getIndexDataFromHotspotData(new Person(1004,"jim"));
if (jsonSource != null) {
IndexRequestBuilder requestBuilder = client.prepareIndex("test_index",
"test").setRefresh(true);
requestBuilder.setSource(jsonSource)
.execute().actionGet();
}
}
public String getIndexDataFromHotspotData(Person p){
String result = null;
if(p != null){
try {
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject().field("id",p.getId()).field("name",p.getName()).endObject();
result = builder.string();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}

查询数据

ES支持分页查询获取数据,也可以一次性获取大量数据,需要使用Scroll Search,QueryBuilder是一个查询条件

	public List<Long> searchData(QueryBuilder builder){
List<Long> ids = new ArrayList<>();
SearchResponse response = client.prepareSearch("test_index").setTypes("test").setQuery(builder).setSize(10).execute().actionGet();
SearchHits hits = response.getHits();
for(SearchHit hit : hits){
Long id = (Long) hit.getSource().get("id");
ids.add(id);
}
return ids;
}

Elasticsearch Java API简介的更多相关文章

  1. [搜索]ElasticSearch Java Api(一) -添加数据创建索引

    转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...

  2. Elasticsearch java api 基本搜索部分详解

    文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...

  3. Elasticsearch java api 常用查询方法QueryBuilder构造举例

    转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...

  4. 第08章 ElasticSearch Java API

    本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...

  5. Elasticsearch Java API深入详解

    0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...

  6. Elasticsearch Java API 很全的整理

    Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种.相比来说transportClient API效率更高, ...

  7. ElasticSearch Java api 详解_V1.0

    /×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...

  8. Elasticsearch JAVA api搞定groupBy聚合

    本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合.为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group ...

  9. Elasticsearch JAVA api轻松搞定groupBy聚合

    本文给出如何使用Elasticsearch的Java API做类似SQL的group by聚合. 为了简单起见,只给出一级groupby即group by field1(而不涉及到多级,例如group ...

随机推荐

  1. Package gtk+-3.0 was not found in the pkg-config search path

    问题描述: 在fedora21系统上通过rpmbuild构建fcitx的二进制包时出现以上错误,经老程序员指点:“是相应的开发包没有安装” 解决办法: yum installl gtk3-devel  ...

  2. Codeforces 599C. Day at the Beach 模拟

    Day at the Beach time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. 命名空间namespace ,以及重复定义的问题解析

    名字空间是用来划分冲突域的,把全局名字空间划分成几个小的名字空间.全局函数,全局变量,以及类的名字是在同一个全局名字空间中,有时为了防止命名冲突,会把这些名字放到不同的名字空间中去. 首先我们看一下名 ...

  4. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  5. hdu-2844(完全背包+二进制优化模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:问1-m能的得到的硬币的值,所以dp[i]==i即可. #include<iostr ...

  6. 42 Can stress be Avoided ? 压力能够回避吗 ?

    Can stress be Avoided ? 压力能够回避吗 ? ①In the 1960s, medical researchers Thomas Holmes and Richard Rahe ...

  7. Django基础(二)

    https://www.cnblogs.com/yuanchenqi/articles/5716193.html

  8. 20155336 2016-2017-2《JAVA程序设计》第六周学习总结

    20155336 2016-2017-2<JAVA程序设计>第六周学习总结 教材学习内容总结 第十章 串流(Stream): 数据有来源及目的地,衔接两者的是串流对象.如果要将数据从来源取 ...

  9. SSH:Struts + Spring + Hibernate 轻量级Java EE企业框架

    Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本.这个版本以前称为 J2EE.能够帮助我们开 ...

  10. H3C交换机流量镜像

    今天需要对交换机进行本地流量镜像,在此记录: 交换机:H3C S5120 配置本地端口镜像时,用户首先要创建一个本地镜像组,然后为本地镜像组配置源端口和目的端口. 表1-1 配置本地端口镜像 操作 命 ...