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 ...
随机推荐
- 浏览器中调用PHP在执行linux sudo指令时报sudo: sorry, you must have a tty to run sudo
在php程序中使用了exec函数调用sudo指令,在浏览器中访问后,报sudo: sorry, you must have a tty to run sudo错误. 按照网上搜到的方法,修改/etc/ ...
- python 查找字符串同时包含数字和字母的最长子字符串的几种实现方法
有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度 例如上面的字符串同时包含数字和字母的字符串是svda123,长度 ...
- Abp mvc angular 添加视图
在LawAndRegulation项目中添加导航路由(Abp添加菜单)对应的客户端页面. 创建文件 客户端页面在Abp模板项目中默认存放在Abp/Main/views文件夹下,在项目中我们创建属于字典 ...
- .Net Core in Docker - 在容器内编译发布并运行
Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker..Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写. 你搜.Net c ...
- C# GDI绘制仪表盘(纯代码实现)
纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...
- 网易云 MySQL实例迁移的技术实现
本文由 网易云 发布. 我们把数据库里部分或全部 Schema和数据迁移到另一个实例的行为称为实例迁移,将导出数据的实例称为源实例,导入数据的实例称为目标实例. 根据迁移数据库类型的不同,可以分为同 ...
- “全栈2019”Java多线程第二十七章:Lock获取lock/释放unlock锁
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- FunDA(5)- Reactive Streams:Play with Iteratees
FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必 ...
- 频繁项集挖掘之Aprior和FPGrowth算法
频繁项集挖掘的应用多出现于购物篮分析,现介绍两种频繁项集的挖掘算法Aprior和FPGrowth,用以发现购物篮中出现频率较高的购物组合. 基础知识 项:“属性-值”对.比如啤酒2罐. 项集:项的集 ...
- git小白使用教程(一)
本文所涉及命令基本可以涵盖日常开发场景, 对于开发者平时很少使用的命令不再列举,这样不至于让刚刚使用git的小伙伴们看的脑袋大...如有特殊使用可以联系我单独回复. 首先通过一张图了解git的工作流程 ...