elasticsearch(一):JAVA api操作
1.创建一个mavan项目,项目的以来配置如下。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.es</groupId>
<artifactId>es-test</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies> <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.3.2</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency> <dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
2.建立连接elasticsearch的工具类。
package com.util; import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Setting;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException; public class ESUtils {
public static final String INDEX_NAME="userindex"; public static String getIndexName(){
return INDEX_NAME;
}
public static final String TYPE_NAME="tweet"; public static String getTypeName(){
return TYPE_NAME;
} public static Client getClient(){
Settings settings = Settings.builder()
//指定集群名称
.put("cluster.name","my-application")
//探测集群中机器状态
.put("client.transport.sniff",true).build(); //创建客户端
Client client = null;
try {
client = new PreBuiltTransportClient(settings).addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"),9300));
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
} public static void closeClient(Client client){
if(null != client){
client.close();
}
}
}
3.创建索引
/**
* 创建索引
* 如果创建的索引名称已经存在,创建会抛出异常,因此先查询要创建的索引是否已存在,不存在在创建
*/
@Test
public void testCreate(){
//待创建的索引名称
String indexName = "userindex";
//获取连接
Client client = ESUtils.getClient();
//判断索引是否存在
IndicesExistsRequest existsRequest = new IndicesExistsRequest(indexName);
IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
if(!existsResponse.isExists()){
//创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
CreateIndexResponse createIndexResponse = client.admin().indices().create(createIndexRequest).actionGet();
//判断创建是否成功
if (createIndexResponse.isAcknowledged()){
logger.info("创建成功");
}else{
logger.info("创建失败");
}
}else {
logger.info("索引已存在,无法创建");
}
//关闭连接
ESUtils.closeClient(client);
}
4.向索引添加数据
/**
* 向索引中逐条加入数据
*/
@Test
public void add(){
//获取连接
Client client = ESUtils.getClient();
//待添加的json数据
String strJson ="{\"age\":25,\"name\":\"张三\",\"weight\":76,\"married\":true}";
XContentParser parser = null;
try {
//数据解析,因为不支持json和对象类型的数据,要将其转为map
parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY,DeprecationHandler.THROW_UNSUPPORTED_OPERATION,strJson);
//插入数据
IndexResponse indexResponse = client.prepareIndex().setIndex(ESUtils.getIndexName())
.setType(ESUtils.getTypeName())
.setSource(parser.map())
//设置数据的id,id唯一,如果id已存在则是修改
.setId("2")
.execute()
.actionGet(); logger.info("添加成功,"+indexResponse.status());
} catch (IOException e) {
e.printStackTrace();
}finally {
ESUtils.closeClient(client);
}
}
5.修改数据
/**
* 更新数据
*/
@Test
public void update(){
Client client = ESUtils.getClient();
Map<String,Object> map = new HashMap<String, Object>();
map.put("age",56);
map.put("name","李四");
map.put("weight",69);
map.put("married",false);
UpdateResponse updateResponse = client.prepareUpdate()
.setIndex(ESUtils.getIndexName())
.setType(ESUtils.getTypeName())
.setDoc(map)
//要更新的数据的id
.setId("2").execute().actionGet(); logger.info("更新成功,"+updateResponse.status());
ESUtils.closeClient(client);
}
6.删除数据
/**
* 根据id删除数据
*/
@Test
public void delete(){
//获取连接
Client client = ESUtils.getClient();
//删除数据
DeleteResponse deleteResponse = client.prepareDelete()
.setIndex(ESUtils.getIndexName())
.setType(ESUtils.getTypeName())
//设置id
.setId("1")
.execute().actionGet(); logger.info("删除成功,"+deleteResponse.status());
//关闭连接
ESUtils.closeClient(client);
}
7.根据id查询数据
/**
* 根据id查询数据
*/
@Test
public void select(){
//获取连接
Client client = ESUtils.getClient();
//查询数据
GetResponse getResponse = client.prepareGet()
.setIndex(ESUtils.getIndexName())
.setType(ESUtils.getTypeName())
.setId("1")
.execute().actionGet();
//数据
logger.info("data:="+getResponse.getSourceAsString());
//关闭连接
ESUtils.closeClient(client);
}
8.全文查询
/**
* 全文检索数据
*/
@Test
public void search(){
//获取连接
Client client = ESUtils.getClient();
//设置查询条件
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("ipad");
//查询
SearchResponse response = client.prepareSearch(ESUtils.getIndexName())
.setQuery(queryBuilder)
//设置分页
.setFrom(0).setSize(60)
.execute().actionGet();
//获取查询结果
SearchHits shs = response.getHits();
logger.info("查询数据条数:"+shs.getTotalHits());
for (SearchHit hit:shs.getHits()) {
logger.info(hit.getSourceAsString());
}
//关闭连接
ESUtils.closeClient(client);
}
9.批量插入数据
//批量插入数据
@Test
public void testBulk(){
//获取连接
Client client = ESUtils.getClient();
//批量接口
BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
User user = new User();
//设置对象的属性
for (int i=3;i<40002;i++){
user.setName("user_"+UUID.randomUUID().toString().replace("-","").substring(0,6));
SecureRandom random = new SecureRandom();
long l = Math.abs(random.nextLong());
user.setWeight(l);
user.setMarried(l%3==0?true:false);
user.setAge(l%2==0?28:82);
//将对象转为json字符串
Gson gson = new Gson();
String json = gson.toJson(user);
XContentParser parser = null;
//数据转换
try {
parser = XContentFactory.xContent(XContentType.JSON).createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, json);
} catch (IOException e) {
e.printStackTrace();
}
IndexRequestBuilder ir = null;
//预插入数据
try {
ir = client.prepareIndex("userindex","tweet",String.valueOf(i)).setSource(parser.map());
} catch (IOException e) {
e.printStackTrace();
}
bulkRequestBuilder.add(ir);
}
//批量插入
BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet(); //判断插入是否失败
if(bulkResponse.hasFailures()){
//失败原因
logger.info(bulkResponse.buildFailureMessage());
logger.info("失败");
}
}
10.按指定条件查询
/**
* 按指定属性查询
*/
@Test
public void testSearchByFiled(){
//获取连接
Client client = ESUtils.getClient();
//查询过滤器
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//查询条件 查询字段名称 和 值
boolQueryBuilder.must(QueryBuilders.termQuery("age",28));
boolQueryBuilder.must(QueryBuilders.termQuery("married",true));
//知道要查询的索引和type
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils.getIndexName()).setTypes(ESUtils.getTypeName());
//设置查询的分页
searchRequestBuilder.setQuery(boolQueryBuilder).setFrom(0).setSize(10000);
//执行查询
SearchResponse response = searchRequestBuilder.execute().actionGet();
//查询结果数
logger.info("数据总数:"+response.getHits().totalHits);
//变量查询结果集
for (SearchHit hit:response.getHits()) {
logger.info(hit.getSourceAsString());
}
//关闭连接
ESUtils.closeClient(client);
}
11.聚合数据
/**
* 按指定条件聚合数据(分类统计)
*/
@Test
public void testFacets(){
//获取连接
Client client = ESUtils.getClient();
//设置待查询的索引和类型
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(ESUtils
.getIndexName()).setTypes(ESUtils.getTypeName());
//设置查询条件
TermsAggregationBuilder builder = AggregationBuilders
//查询结果集名称
.terms("marry")
//要查询的属性名称
.field("age");
searchRequestBuilder.addAggregation(builder);
//执行查询
SearchResponse response = searchRequestBuilder.execute().actionGet();
//根据设置的名字获取查询结果
Terms terms = response.getAggregations().get("marry");
List<? extends Terms.Bucket> buckets = terms.getBuckets();
Map<String,String> map = new HashMap<String, String>();
//聚合统计数量
for (Terms.Bucket bucket :buckets){
String key = bucket.getKeyAsString();
map.put(key,bucket.getDocCount()+"");
}
//输出查询数量
for (Map.Entry<String,String> entry : map.entrySet()){
logger.info(entry.getKey()+":"+entry.getValue());
}
//关闭连接
ESUtils.closeClient(client);
}
12.删除索引
/**
* 删除索引
*/
@Test
public void testDelete(){
//获取连接
Client client = ESUtils.getClient();
//判断索引是否存在
IndicesExistsRequest existsRequest = new IndicesExistsRequest(ESUtils.getIndexName());
IndicesExistsResponse existsResponse = client.admin().indices().exists(existsRequest).actionGet();
if(existsResponse.isExists()){
//删除
DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete(ESUtils.getIndexName()).execute().actionGet();
if(deleteIndexResponse.isAcknowledged()){
logger.info("删除成功");
}else{
logger.info("删除失败");
}
}else {
logger.info("索引 "+ESUtils.getIndexName()+" 不存在");
}
//关闭连接
ESUtils.closeClient(client);
}
elasticsearch(一):JAVA api操作的更多相关文章
- 使用Java操作Elasticsearch(Elasticsearch的java api使用)
1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询,格式是json. 索引index,相当于数据库中的 ...
- Elasticsearch中JAVA API的使用
1.Elasticsearch中Java API的简介 Elasticsearch 的Java API 提供了非常便捷的方法来索引和查询数据等. 通过添加jar包,不需要编写HTTP层的代码就可以开始 ...
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- 使用Java API操作HDFS文件系统
使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- Hadoop之HDFS(三)HDFS的JAVA API操作
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
- MongoDB Java API操作很全的整理
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
- java api操作
java api操作 导入开发包 将hbase安装包中lib下包导入java项目 创建表 Configuration conf = HBaseConfiguration.create(); c ...
随机推荐
- 日志记录的作用和方法 java
程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态.好的日志记录方式可以提供我们足够多定位问题的依据.日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事 ...
- Java中取两位小数
请参考下面函数: private String getFormated(String s){ float f=Float.parseFloat(s); java.text. ...
- Android-intent.addFlags-Activity启动模式
之前写的Android-Activity启动模式(launchMode),Android-Activity启动模式-应用场景,讲解的都是在AndroidManifest.xml配置launchMode ...
- Android DalivkVM与JVM的比较
JVM 与 DalivkVM的区别 Android 为什么还有搞一个Dalivk虚拟机,不是已经就有Java虚拟机了吗,为什么还要专门搞一个Dalivk虚拟机呢? 答: 1.以前Java是Sun公司的 ...
- Flash(as3) 调整显示对象颜色
在游戏开发中改变显示对象的颜色是比较常见的操作,那么除了在FlashCS中调整,AS3又提供了怎样的方式呢? ColorTransform 这个类是轻量级的应用,其构造参数如下: ColorTrans ...
- 设计模式之代理模式(Proxy Pattern)_补充篇
写在前面: 代理模式的内部原理,作用及远程代理的实现在上一篇博文中都做了详细解释,本文只是对其内容的补充,介绍其它代理 一.虚拟代理 首先,明确虚拟代理的作用:在巨大对象被真正创建出来之前,用虚拟代理 ...
- (zxing.net)一维码MSI的简介、实现与解码
一.简介 MSI/Plessey 条码(也被称为 MSI 或 Modified Plessey)是一款数字条码,多用于超市.存储用的仓库和其他贮藏室的货架.货架上的条码可以告知货架上的产品.应放数量和 ...
- Python: pyinstaller打包exe(含file version信息)
最近项目上一直都是用Spyder直接运行.py文件的方式来执行每日的自动化程序,每天都要手动去点击Run来执行一次,所以考虑把.py文件直接打包成exe,然后用windows的task schedul ...
- 【Cocos2d-Js基础教学(1)JS -Mac配置篇】
一.准备工作 Windows配置篇请见 http://cn.cocos2d-x.org/tutorial/show?id=1396 1.安装python 2.下载Android SDK Android ...
- 认识与学习shell
linux的终端机执行命令的方式,是通过bash环境来处理的.bash包括变量的设置与使用,.bash操作环境的构建.数据流重定向的功能.下面的知识,对主机的维护与管理有重要的帮助. 管理整个计算机硬 ...