加入依赖

我本地的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. 详解JMeter正则表达式

    详解JMeter正则表达式(1) 1.概览 JMeter中包含范本匹配软件Apache Jakarta ORO .在Jakarta网站上有一些关于它的文档,例如a summary of the pat ...

  2. canvas标签的基本用法

    1.canvas和其他标签一样使用,但是IE8以下是不支持的,可以在canvas里面加一个span用来提示,例如: <canvas> <span>IE8不支持canvas< ...

  3. part1:8-远程登录Linux

    Linux远程登录 Linux系统中是通过ssh服务实现的远程登录功能.默认ssh服务开启了22端口,而且在安装完成系统时,这个服务已经安装,并且是开机启动的.所以不需要额外配置就能直接远程登录Lin ...

  4. Servlet的Cookie值保存与获取

    今天测试设置和获取Cookie遇到了一点小问题,很奇怪的问题:把J2ee服务部署在本地 8080端口:访问任何一个服务时,如果客户端没有cookie,则下发cookie, 如果客户端已经有了该cook ...

  5. phalApi框架打印SQL语句

    http://demo.phalapi.net/?service=User.getBaseInfo&user_id=1&__sql__=1

  6. 在“开始”菜单中的“运行”一栏输入特定命令打开windows程序

    winver 检查Windows版本   wmimgmt.msc 打开Windows管理体系结构(wmi)   wupdmgr Windows更新程序   wscript Windows脚本宿主设置 ...

  7. IntelliJ IDEA 2017版 SpringBoot的web项目补充

    一.注解        @SpringBootApplication:Spring Boot项目的核心注解,主要目的是开启自动配置.        @Configuration:这是一个配置Sprin ...

  8. HDU 1756 Cupid's Arrow (几何问题,判定点在多边形内部)

    题意:中文的么,自己看喽. 析:很容易明白是判定点是不是在多边形内部,一般是向量来判定,我一开始用点在向量的右侧,因为是顺时针给的,只要点全在外侧或边上, 就可以,暴力一下就ok.由于这个是浮点数,一 ...

  9. Perf -- Linux下的系统性能调优工具,第 1 部分

    Perf 简介 Perf 是用来进行软件性能分析的工具. 通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计.它不但可以分析指定应用程序的性能问题 (per t ...

  10. [FMX]将 Android 程序切换到后台及从后台切换到前台实现

    有时候,我们需要将自己的Android程序切换到后台运行,在必要时,将其切换到前台运行.下面提供了一种实现方式,首先需要引用三个单元:   1 uses Androidapi.JNI.App,Andr ...