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 ...
随机推荐
- 酒店订房系统:如何使用mysql来确定一个时间段内的房间都是可订的
需要解决的问题: 假设一个用户选择了日期范围来进行订房,例如:2014-04-25至2014-04-30 ,那么现在问题就出现,你必须要确认在这个时间段内某个房间是否都是有房间的,如果没有那么当然不能 ...
- Android 广播代码的发送与接收
Android四大组件之一广播,使用的也比较多,广播可大致分为两种,一种是Android系统区域的广播,是由系统指令发出,例如:点亮屏幕广播,开机过程中的一些广播 省略-, 然而还有一种广播就是我们自 ...
- SSH 安全建议
当你查看你的 SSH 服务日志,可能你会发现充斥着一些不怀好意的尝试性登录.这里有 5 条常规建议(和一些个别特殊策略)可以让你的 OpenSSH 会话更加安全. 强化密码登录 密码登录很方便,因为你 ...
- TFS:需要包管理许可证才能进一步操作You need a Package Management license to go further
问题: 为什么团队成员没有查看包管理服务的权限?如下图: 答案: TFS系统的访问级别设置,决定在默认配置中用户是否有包管理的访问权限.默认配置中,只有"VS Enterprise" ...
- 在每页(分页)报表中重复显示标题 - SQL Server Reporting Service (SSRS)
问题描述 TFS系统提供多种报表,有图表(Chart).Web面板(Dashboard).SharePoint面板.Excel报表,SQL Server Reporting Serivce(SSRS) ...
- LinkServer--服务器选项
1. RPC和RPC out 当RPC和RPC out被设置为true时,允许调用远程服务器的存储过程 2.为RPC启用针对分布式事务的升级 使用该选项可通过 Microsoft 分布式事务处理协调器 ...
- INNER JOIN与LEFT JOIN在SQL Server的性能
我创建了INNER JOIN 9桌,反正需要很长的(超过五分钟).所以,我的民歌改变INNER JOIN来LEFT JOIN LEFT JOIN的性能较好,在首次尽管我所知道的.之后我变了,查询的速度 ...
- asp.net core mvc 管道之中间件
asp.net core mvc 管道之中间件 http请求处理管道通过注册中间件来实现各种功能,松耦合并且很灵活 此文简单介绍asp.net core mvc中间件的注册以及运行过程 通过理解中间件 ...
- [调试]VS2013调试时提示“运行时当前拒绝计算表达式的值”
VS2013 下单元测试调试时遇到的问题,以前倒从未遇到过. 中文关键字在百度和谷歌中搜索均无果. Google 下搜索 “The runtime has refused to evaluate th ...
- NET 集合分页查询
参数: var list = new List<int>(); // 集合 ; // 总数量 ; // 每页查询数量 第一种: ? totalCount / pageSize : tota ...