基于java的ES开发
3.1 环境配置
Jdk 1.8及以上
Elasticsearch.client 5.5.2(与服务器版本一致)
Log4j 2.7及以下
maven工程必要的jar包依赖
|
<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.rodge</groupId> <artifactId>elasticFirstDemo</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <elasticSearch.version>5.5.2</elasticSearch.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>${elasticSearch.version}</version> </dependency> </dependencies> </project> |
日志文件log4j2.properties文件内容
|
appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%t] %-5p %c - %m%n rootLogger.level = info rootLogger.appenderRef.console.ref = console |
3.2 简单查询
测试用例, 查询book索引中novel中id为1的文档
|
package com.rodge.elasticSearch.firstDemo; import java.net.InetAddress; import java.net.UnknownHostException; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.junit.Test; public class ESFirstDemo { @SuppressWarnings("unchecked") public TransportClient client() throws UnknownHostException { // es地址, 地址为192.168.253.129(此处地址不能加"http://"), 此处的端口为es的tcp端口为9300, // 而不是之前的http9200端口, 如果es有多可节点, 可以创建多个node, 然后再client中add进去 // 注意,这里的端口号不是9200,而是9300。9200端口是用来让HTTP REST // API来访问ElasticSearch,而9300端口是传输层监听的默认端口。 InetSocketTransportAddress node = new InetSocketTransportAddress( InetAddress.getByName("192.168.253.129"), 9300); // es的配置类 Settings settings = Settings.builder().put("cluster.name", "wali").build(); // TransportClient是es启动的核心类, 后续的关于es的开发都是围绕着TransportClient进行的 TransportClient client = new PreBuiltTransportClient(settings); client.addTransportAddress(node); return client; } @Test public void get() throws UnknownHostException { GetResponse result = client().prepareGet("book", "novel", "1").get(); System.out.println(result.getSource().toString()); } } |
3.3 插入
3.3.1 指定id插入
|
// 添加文档, 指定id插入 @Test public void addWithID() throws IOException { String title = "一阳指"; String author = "王重阳"; int wordCount = 5000; Date publishDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = dateFormat.format(publishDate); // 构造es文档 // 使用es自带的json工具构造 XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject() .field("title", title).field("author", author).field("word_count", wordCount) .field("publish_date", format).endObject(); //将数据插入到index为book, type为novel的索引中, 并且指定id为15 IndexResponse indexResponse = client().prepareIndex("book", "novel").setId("15") .setSource(xContentBuilder).get(); System.out.println(indexResponse.getId()); } |
3.3.2 es随机生成id插入
|
// 添加文档, id为es随机生成 @Test public void add() throws IOException { String title = "落英剑法"; String author = "黄药师"; int wordCount = 3000; Date publishDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = dateFormat.format(publishDate); // 构造es文档 // 使用es自带的json工具构造 XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject() .field("title", title).field("author", author).field("word_count", wordCount) .field("publish_date", format).endObject(); //将数据插入到index为book, type为novel中的索引中, id有es随机生成, 并获取返回信息 IndexResponse indexResponse = client().prepareIndex("book", "novel") .setSource(xContentBuilder).get(); System.out.println(indexResponse.toString()); } |
3.3.4 批量插入
|
@Test public void dbImportEs() { Long count = 10000L;// 每次采集条数 String index = "rodge";// es索引名称 String type = "user";// es中类型名称 BulkRequestBuilder prepareBulk = transportClient.prepareBulk(); long startTime = System.currentTimeMillis(); System.out.println("startTime: " + startTime); for (int i = 1; i <= count; i++) { Map<String, Object> ret = new HashMap<String, Object>(); ret.put("recordtime", System.currentTimeMillis()); ret.put("area", "北京" + i); ret.put("usertype", 33 + i); ret.put("count", i); prepareBulk.add(transportClient.prepareIndex(index, type).setSource(ret)); // 每10000条提交一次 if (i % 1000 == 0) { BulkResponse actionGet = prepareBulk.execute().actionGet(); System.out.println(actionGet.toString()); long endTime = System.currentTimeMillis(); System.out.println("endTime: " + endTime); System.out.println("消耗的时间: " + (endTime - startTime) / 1000); } } } |
3.4 删除
3.4.1 删除指定id的文档
|
// 删除 -- 删除指定id的文档 @Test public void deleteById() throws UnknownHostException { DeleteResponse deleteResponse = client() .prepareDelete("book", "novel", "AV8aBzNyHGrPjnHoRYlK").get(); System.out.println(deleteResponse.getVersion()); } |
3.4.2 删除索引
删除索引是不可逆的, 慎用!
|
// 删除 -- 删除索引 @Test public void deleteIndex() throws UnknownHostException { DeleteIndexResponse deleteIndexResponse = client().admin().indices().prepareDelete("people") .get(); System.out.println(deleteIndexResponse.toString()); } |
3.5 修改
3.5.1 根据id更新指定的文档
|
// 更新 -- 根据id更新文档 @Test public void updateById() throws IOException, InterruptedException, ExecutionException { UpdateRequest updateRequest = new UpdateRequest("book", "novel", "1"); XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject(); contentBuilder.field("author", "张三_update"); contentBuilder.field("title", "移魂大法_update"); contentBuilder.field("word_count", 200); contentBuilder.field("publish_date", "2017-10-16"); contentBuilder.endObject(); updateRequest.doc(contentBuilder); UpdateResponse updateResponse = client().update(updateRequest).get(); System.out.println(updateResponse.toString()); } |
3.6 复合查询接口开发
|
// 复合查询 @Test public void complexQuery() throws UnknownHostException { // 匹配查询 BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(QueryBuilders.matchQuery("author", "瓦力")); boolQueryBuilder.must(QueryBuilders.matchQuery("title", "elasticsearch精通")); //boolQueryBuilder.must(QueryBuilders.matchQuery("publish_date", "")); // 范围查询 RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("word_count"); rangeQueryBuilder.from(200); rangeQueryBuilder.to(3000); boolQueryBuilder.filter(rangeQueryBuilder); SearchRequestBuilder requestBuilder = client(). prepareSearch("book").setTypes("novel") .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setQuery(boolQueryBuilder) .setFrom(0) .setSize(10); System.out.println("requestBuilder " + requestBuilder); SearchResponse searchResponse = requestBuilder.get(); List<Map<String, Object>> resultList = new ArrayList<Map<String,Object>>(); for (SearchHit hit : searchResponse.getHits()) { resultList.add(hit.getSource()); } System.out.println("resultList: " + resultList); } |
基于java的ES开发的更多相关文章
- 基于java spring框架开发部标1078视频监控平台精华文章索引
部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...
- nginx unit 1.8 支持基于java servlet 的开发模型
最近unit 1.8 发布了,有两个比较大的新特性,内部请求路由,以及java servlet 容器应用的开发 内部请求路由配置参考 { "routes": [ { "m ...
- 最新研发的基于Java的高速开发平台
可自我扩展的智能开发平台 在开发平台设计过程中,联科研发部一開始就希望能研发一套智能开发机制能自己开发自己的平台-即一个能自我修复和自我扩展的开发平台.这个开发平台不但能开发其它应用还能不 ...
- 基于MINA框架快速开发网络应用程序
1.MINA框架简介 MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架.通过使用M ...
- Lucene:基于Java的全文检索引擎简介
Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...
- Lucene:基于Java的全文检索引擎简介 (zhuan)
http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
随机推荐
- mysql进阶(十)不靠谱的FLOAT数据类型
今天在设计数据表时,突然发现原来FLOAT原来是很不靠谱的,所以在这里建议大家换成DOUBLE类型, 原因是: 在mysql手册中讲到,在MySQL中的所有计算都是使用双精度完成的,使用float(单 ...
- 使用 /sys 文件系统访问 Linux 内核
sysfs 与 /sys sysfs 文件系统总是被挂载在 /sys 挂载点上.虽然在较早期的2.6内核系统上并没有规定 sysfs 的标准挂载位置,可以把 sysfs 挂载在任何位置,但较近的2.6 ...
- 如何成为Android高手
要成为Android 高手并不是一件容易的事情.并不是很多人想象的 能够飞快的写出几行漂亮的代码去解决一些困难的问题 就是Android 高手了.真正的Android 高手需要考虑的问题远远不是写些漂 ...
- 《java入门第一季》之面向对象面试题
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象. 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象. 方法重载能改变 ...
- centos6.2安装桌面环境 与中文支持
yum groupinstall "X Window System" //安装Xorgyum groupinstall "Desktop" //安装GNOMEy ...
- 基于ARM_contexA9 led驱动编程
关于友善之臂出的这款contexA9开发板,目前在网络上的资源较少,特别是内核的,非常之少,鉴于这种情况,我将会写一个系列的驱动来做关于tiny4412这款板子开发的总结. 简单介绍一下: Tiny4 ...
- Java-ServletInputStream
import java.io.InputStream; import java.io.IOException; /** * Provides an input stream for reading b ...
- Linux自动安装JDK的shell脚本
Linux自动安装JDK的shell脚本 A:本脚本运行的机器,Linux B:待安装JDK的机器, Linux 首先在脚本运行的机器A上确定可以ssh无密码登录到待安装jdk的机器B上,然后就可以在 ...
- nasm中的表达式
nasm表达式支持2个特殊的记号 $和$$;前者标识其所在源码行的开始处地址,所以你可以这样写死循环: jmp $ 而后者标识当前段开始处的地址,你可以通过: $-$$ 找出当前代码在段内的偏移. n ...
- cocos2d-x 控制台输出日志
在2dx中用CCLog输出日志,但是在vs的控制台中由于信息很多,很难发现.可以用下面方法,会重新启动一个黑色的控制台来输出日志 修改main.c文件,如下: #include "main. ...