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开发的更多相关文章

  1. 基于java spring框架开发部标1078视频监控平台精华文章索引

    部标1078视频监控平台,是一个庞杂的工程,涵盖了多层协议,部标jt808,jt809,jt1078,苏标Adas协议等,多个平台功能标准,部标796标准,部标1077标准和苏标主动安全标准,视频方面 ...

  2. nginx unit 1.8 支持基于java servlet 的开发模型

    最近unit 1.8 发布了,有两个比较大的新特性,内部请求路由,以及java servlet 容器应用的开发 内部请求路由配置参考 { "routes": [ { "m ...

  3. 最新研发的基于Java的高速开发平台

    可自我扩展的智能开发平台       在开发平台设计过程中,联科研发部一開始就希望能研发一套智能开发机制能自己开发自己的平台-即一个能自我修复和自我扩展的开发平台.这个开发平台不但能开发其它应用还能不 ...

  4. 基于MINA框架快速开发网络应用程序

    1.MINA框架简介 MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架.通过使用M ...

  5. Lucene:基于Java的全文检索引擎简介

    Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...

  6. Lucene:基于Java的全文检索引擎简介 (zhuan)

    http://www.chedong.com/tech/lucene.html ********************************************** Lucene是一个基于Ja ...

  7. 基于Java Mina框架的部标808服务器设计和开发

    在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...

  8. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  9. 基于Java Mina框架的部标jt808服务器设计和开发

    在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...

随机推荐

  1. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19913755 . 一. Android资源文件简介 1 ...

  2. Android通过编译源代码提供系统服务-android学习之旅(85)

    通过编译android4.1.2的源代码,添加一个FregServer的系统服务,以及一个服务代理FregClient 具体分为三部分,client,common,server,common中规定了c ...

  3. CSS3 Media Queries 简介

    原文链接:Introduction to CSS3 Media Queries 原文日期: 2014年2月21日 翻译日期: 2014年2月26日 翻译人员: 铁锚 简介 随着移动设备的日益普及,we ...

  4. Android使用Canvas实现跑马灯

    网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计.这样做有很多的缺点: 1.如果TextView没有获取焦点,那么跑马灯的效果无法实现. 2.如果文本长度小于TextView的宽度, ...

  5. 《java入门第一季》之面向对象(构造方法)

    /* 构造方法: 给对象的数据进行初始化 格式: A:方法名与类名相同 B:没有返回值类型,连void都没有 C:没有具体的返回值 */ class Student { private String ...

  6. ANDROID 中设计模式的采用--结构型模式

            结构型模式中的适配器模式.外观模式.装饰模式.代理模式都属于包装模式,都是对另外的类或对象的包装,只是各自的意图不同. 适配器模式通过对另外的类或对象的包装,将其接口转换为用户期望 ...

  7. 数据cube的schema与sql的对应的关系

    用schema workbench 设置cube的维度结构 saiku 使用的cube,会将不同维度的查询转化为sql语句. schema中, cube的事实表和dimension表进行自然连接,具体 ...

  8. GDI+ 读取jpg图片每个像素的值

    // 读取jpg图像像素rgb值.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #in ...

  9. "《算法导论》之‘树’":二叉查找树

    树的介绍部分摘取自博文二叉查找树(一).二叉查找树(二).二叉查找树. 1. 树的介绍 1.1 树的定义 树是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合. 把它叫做“ ...

  10. Linux - gcc 的简易用法 (编译、参数与链结)

    # 仅将原始码编译成为目标档,并不制作连结等功能: [root@www ~]# gcc -c hello.c # 会自动的产生 hello.o 这个文件,但是并不会产生 binary 运行档. # 在 ...