Elasticsearch的java客户端JEST的操作
准备
把Elasticsearch安装好
安装百度上有很多资料。
导入必要的包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.2.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.6</version>
</dependency>
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>2.0.4</version>
</dependency>
实体类
@Data
public class ArticleDTO implements Serializable {
private Integer id;
private String authorId;
private String articleId;
private String title;
private String content;
private Integer status;
}
Elasticsearch的Search
最好先了解一下:
Elasticsearch的Search详解
JEST的相关操作
- 发现这个客户端工具使用了大量的构造器模式。
- 这么多的构造器的抽象都是针对于ES中的概念和查询语法抽象出来的,所以对ES客户端的理解要结合查询语言。
package com.ztjy.es;
import com.ztjy.demo.model.ArticleDTO;
import com.ztjy.demo.service.ArticleService;
import com.ztjy.demo.service.search.JestClientServer;
import com.ztjy.tool.RandomUtils;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.JestResult;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.core.*;
import io.searchbox.indices.DeleteIndex;
import lombok.extern.log4j.Log4j2;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
@Log4j2
public class TestEs {
public static final String INDEX_NAME = "test_index_ws";
public static final String TYPE_NAME = "my_type";
public static final String TYPE_NAME2 = "my_type2";
public static final String URI = "http://172.16.200.17:9200";
@Autowired
private JestClientServer jestClientServer;
@Autowired
private ArticleService articleService;
//删除index下的所有
/**
* 创建index/type/document
* <p>单个</p>
*/
@Test
public void testCreateIndex(){
ArticleDTO article = createArticle(1000);
addOrUpdateIndex(article);
}
/**
* 删除index里面的document全部清除了
*/
@Test
public void testDeleteIndex(){
DeleteIndex deleteIndex = new DeleteIndex.Builder(INDEX_NAME).build();
JestClient jestClient = createClient();
try {
JestResult result = jestClient.execute(deleteIndex);
log.info("执行结果:{}",result.isSucceeded());
log.info("返回记过:{}",result.getSourceAsString());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 测试修改index
*/
@Test
public void testUpdateIndex(){
ArticleDTO article = createArticle(1000);
article.setTitle(article.getTitle()+"3333!");
addOrUpdateIndex(article);
}
/**
* 测试批量添加index
*/
@Test
public void testBulkIndex(){
bulkIndex();
}
/**
* 测试批量删除index
*/
@Test
public void testbulkDeleteIndex(){
bulkDeleteIndex();
}
/**
* 删除单个index
*/
@Test
public void deleteSigleIndex(){
deleteSingeIndex();
}
/**
* 测试获取单个index
*/
@Test
public void testGetIndex(){
getSingleIndex();
}
/**
* 根据条件,分页查询
*
*
*/
@Test
public void testQueryByTypeAndIds(){
QueryByTypeAndIds();
}
@Test
public void testQueryByCnd(){
/**
*{
* "query" : {
* "match" : {//对应着各种类型的QueryBuilder,这里的类型是短语匹配
* "title" : {
* "query" : "宝爸给孩子",
* "type" : "phrase"
* }
* }
* }
* }
* //SearchSourceBuilder对应着查询json结构的最外层(from,size,query,post_filter,sort,aggs)
* //QueryBuilder对应着各种过滤条件:精确搜索,布尔,范围
*{
* "from" : 0,
* "size" : 5,
* "query" : {
* "match" : {
* "title" : {
* "query" : "宝爸给孩子",
* "type" : "phrase"
* }
* }
* },
* "post_filter" : {
* "bool" : {
* "must" : [ {
* "term" : {
* "status" : 6
* }
* }, {
* "range" : {
* "id" : {
* "from" : null,
* "to" : 500,
* "include_lower" : true,
* "include_upper" : true
* }
* }
* }, {
* "terms" : {
* "title" : [ "护士" ]
* }
* } ],
* "_name" : "title"
* }
* },
* "sort" : [ {
* "id" : {
* "order" : "desc"
* }
* } ]
* }
*
*
*/
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "宝爸给孩子");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("status", 6))
.must(QueryBuilders.rangeQuery("id").lte(500))
.must(QueryBuilders.termsQuery("title","护士"));
searchSourceBuilder.from(0).
size(5).
sort("id", SortOrder.DESC).
postFilter(boolQueryBuilder).
query(matchQueryBuilder);
//聚合
TermsBuilder status = AggregationBuilders.terms("group_by_tatus").field("status");
searchSourceBuilder.aggregation(status);
Search search = new Search.Builder(searchSourceBuilder.toString()).addIndex(INDEX_NAME).addType(TYPE_NAME).build();
JestClient jestClient = createClient();
try {
SearchResult searchResult = jestClient.execute(search);
log.info("执行结果{}",searchResult.isSucceeded());
List<SearchResult.Hit<ArticleDTO, Void>> hitList = searchResult.getHits(ArticleDTO.class);
hitList.stream().map((hit)-> hit.source).forEach((article)->{
System.out.println(article);
});
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 查询多个type下和指定集合去查询
*
*/
private void QueryByTypeAndIds() {
SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
String [] ids=new String[]{"1","2","3","4","5"};
String [] types=new String[]{TYPE_NAME,TYPE_NAME2};
boolQueryBuilder.must(QueryBuilders.idsQuery(types).addIds(ids));
searchSourceBuilder.query(boolQueryBuilder);
Search search=new Search.Builder(searchSourceBuilder.toString()).build();
JestClient jestClient = createClient();
try {
SearchResult searchResult = jestClient.execute(search);
log.info("执行结果{}",searchResult.isSucceeded());
List<SearchResult.Hit<ArticleDTO, Void>> hitList = searchResult.getHits(ArticleDTO.class);
for (SearchResult.Hit<ArticleDTO, Void> hit:hitList) {
ArticleDTO article = hit.source;
log.info(article);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void getSingleIndex() {
Get get = new Get.Builder(INDEX_NAME, "23726").type(TYPE_NAME).build();
JestClient jestClient = createClient();
try {
DocumentResult documentResult = jestClient.execute(get);
log.info("执行结果{}",documentResult.isSucceeded());
ArticleDTO articleDTO = documentResult.getSourceAsObject(ArticleDTO.class);
log.info("查询的值{}",articleDTO.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
private void deleteSingeIndex() {
Delete delete = new Delete.Builder("AW1xUehNzfOadqqIiWnt").index(INDEX_NAME).type(TYPE_NAME).build();
JestClient client = createClient();
try {
DocumentResult documentResult = client.execute(delete);
log.info("是否添加成功:{}",documentResult.isSucceeded());
log.info("结果:{}",documentResult.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}
private void bulkDeleteIndex(){
Bulk.Builder bulk = new Bulk.Builder();
List<String> articleIds =new ArrayList<>(100);
articleIds.add("21082");
articleIds.add("21191");
articleIds.add("22053");
articleIds.add("20761");
articleIds.add("21038");
for(String id:articleIds){
Delete delete = new Delete.Builder(id).index(INDEX_NAME).type(TYPE_NAME).build();
bulk.addAction(delete);
}
try {
JestClient jestClient = createClient();
BulkResult result = jestClient.execute(bulk.build());
if (result != null && result.isSucceeded()){
log.info("ES 批量删除完成");
log.info("=====================>result:{}.",result.getJsonString());
}else{
log.error("=====================>result:{}.",result.getJsonString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void addOrUpdateIndex(ArticleDTO article) {
try {
Index.Builder indexBuilder=new Index.Builder(article);
indexBuilder.index(INDEX_NAME).type(TYPE_NAME).id(String.valueOf(article.getId()));
Index index = indexBuilder.build();
JestClient jsClient = createClient();
DocumentResult result = jsClient.execute(index);
log.info("是否添加成功:{}",result.isSucceeded());
log.info("结果:{}",result.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}
public void bulkIndex(){
Bulk.Builder bulk = new Bulk.Builder();
List<ArticleDTO> listArticle = getListArticle();
Iterator<ArticleDTO> iterator = listArticle.iterator();
while (iterator.hasNext()){
ArticleDTO article = iterator.next();
Index index = new Index.Builder(article).id(String.valueOf(article.getId())).index(INDEX_NAME).type(TYPE_NAME).build();
bulk.addAction(index);
}
try {
JestClient jestClient = createClient();
BulkResult result = jestClient.execute(bulk.build());
if (result != null && result.isSucceeded()){
log.info("ES 批量插入完成");
log.info("=====================>result:{}.",result.getJsonString());
}else{
log.error("=====================>result:{}.",result.getJsonString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private ArticleDTO createArticle(int id) {
ArticleDTO articleDTO=new ArticleDTO();
articleDTO.setId(id);
articleDTO.setArticleId(String.valueOf(id*100));
articleDTO.setAuthorId(String.valueOf(id*1000));
articleDTO.setTitle("折腾三天生下9斤男婴,宝爸给孩子取了88画名字,护士直接笑哭");
articleDTO.setContent("小静上个星期刚顺产生下一名男婴,当时这个孩子折腾了她快三天三夜才成功生下来。可把小静给疼到生无绝恋了,最后孩子出生后足足有9斤重。");
articleDTO.setStatus(RandomUtils.randomInt(10));
return articleDTO;
}
private List<ArticleDTO> getListArticle(){
List<ArticleDTO> articleDTOS=new ArrayList<>(100);
for (int i =0;i<100;i++){
articleDTOS.add(createArticle(i+1));
}
return articleDTOS;
}
private JestClient createClient() {
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig.Builder(URI)
.multiThreaded(true)
.build());
JestClient client = factory.getObject();
return client;
}
}
Elasticsearch的java客户端JEST的操作的更多相关文章
- Elasticsearch及java客户端jest使用
本文使用Github中的Elasticsearch-rtf,已经集成了众多的插件,例如必须使用的中文分词等,可以简单的通过配置来启用中文分词.本文主要分为以下几部分: 1.配置和启用中文分词: 2.定 ...
- elasticsearch 口水篇(3)java客户端 - Jest
elasticsearch有丰富的客户端,java客户端有Jest.其原文介绍如下: Jest is a Java HTTP Rest client for ElasticSearch.It is a ...
- Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解
Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...
- elasticsearch 口水篇(4)java客户端 - 原生esClient
上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...
- 使用Java客户端对Redis进行操作
一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...
- ElasticSearch java客户端更新时出现的错误:NoNodeAvailableException[None of the configured nodes are available
下午尝试 用ElasticSearch 的java客户端去做数据检索工作,测试了一下批量更新,代码如下: public static void bulkUpdateGoods(List<Goo ...
- Kubernetes官方java客户端之七:patch操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes官方java客户端之八:fluent style
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Jest — ElasticSearch Java 客户端
1. 介绍 任何使用过Elasticsearch的人都知道,使用基于rest的搜索API构建查询可能是单调乏味且容易出错的. 在本教程中,我们将研究Jest,一个用于Elasticsearch的HTT ...
随机推荐
- Win10安装PyQt5与Qt Designer
1.直接在cmd中通过pip安装PyQt5 1 pip install pyqt5 会自动下载PyQt5以及sip并安装,因为PyQt5不再提供Qt Designer等工具,所以需要再安装pyqt5- ...
- 前端知识总结--js异步事件顺序
js中异步事件中容易混淆的 Promise 和 setTimeout 的执行顺序是怎样的? setTimeout(() => console.log(1), 0); new Promise(fu ...
- S2-048
前言 S2-048漏洞和struts2-struts1-plugin插件有关,该插件用于将Struts1的action也能在struts2上运行,提高兼容性(作用是我猜的~) 正文 我们先看下这个插件 ...
- spring-security原理学习
spring security使用分类: 如何使用spring security,相信百度过的都知道,总共有四种用法,从简到深为:1.不用数据库,全部数据写在配置文件,这个也是官方文档里面的demo: ...
- Linux CentOS7 httpd 配置注释
本文首发:https://www.somata.work/2019/LinuxCentOShttpdConfigComment.html 如果没看懂可以去看看官方发布的文档 apache官方文档 co ...
- 1.Hbase简介
1. Hbase简介 1.1. 什么是hbase(面向列) HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模 结构化存储集群 ...
- Linux赋予root权限
按照帖子都一一尝试了下 https://blog.csdn.net/yajie_china/article/details/80636783 首先增加用户和给新用户创建密码,都不用说 用useradd ...
- Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装
Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装 目录: 一.OpenCV安装包下载 二.cmake安装 三.OpenCV安装 正文 一.OpenCV安装包下 ...
- JDK源码那些事儿之我眼中的HashMap
源码部分从HashMap说起是因为笔者看了很多遍这个类的源码部分,同时感觉网上很多都是粗略的介绍,有些可能还不正确,最后只能自己看源码来验证理解,写下这篇文章一方面是为了促使自己能深入,另一方面也是给 ...
- Jmeter(一)非GUI模式压测(NON-GUI模式)结果解析TPS
非GUI模式压测(NON-GUI模式)结果解析TPS 准备工作 从脚本已录制成功之后开始进行压测 安装Jmeter拓展插件 查看 Transactions per Second https://jme ...