准备

把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的操作的更多相关文章

  1. Elasticsearch及java客户端jest使用

    本文使用Github中的Elasticsearch-rtf,已经集成了众多的插件,例如必须使用的中文分词等,可以简单的通过配置来启用中文分词.本文主要分为以下几部分: 1.配置和启用中文分词: 2.定 ...

  2. elasticsearch 口水篇(3)java客户端 - Jest

    elasticsearch有丰富的客户端,java客户端有Jest.其原文介绍如下: Jest is a Java HTTP Rest client for ElasticSearch.It is a ...

  3. Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解

    Elasticsearch JAVA操作有三种客户端: 1.TransportClient 2.JestClient 3.RestClient 还有种是2.3中有的NodeClient,在5.5.1中 ...

  4. elasticsearch 口水篇(4)java客户端 - 原生esClient

    上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...

  5. 使用Java客户端对Redis进行操作

    一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...

  6. ElasticSearch java客户端更新时出现的错误:NoNodeAvailableException[None of the configured nodes are available

    下午尝试 用ElasticSearch  的java客户端去做数据检索工作,测试了一下批量更新,代码如下: public static void bulkUpdateGoods(List<Goo ...

  7. Kubernetes官方java客户端之七:patch操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. Kubernetes官方java客户端之八:fluent style

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. Jest — ElasticSearch Java 客户端

    1. 介绍 任何使用过Elasticsearch的人都知道,使用基于rest的搜索API构建查询可能是单调乏味且容易出错的. 在本教程中,我们将研究Jest,一个用于Elasticsearch的HTT ...

随机推荐

  1. 【web】Chrome 浏览器中查看 webSocket 连接信息

    1.以下代码实现一个webSocket连接,在文本输入框中输入内容,点击发送,通过服务器,返回相同的内容显示在下方. 1 <!DOCTYPE html> 2 <html lang=& ...

  2. (详细)JAVA使用JDBC连接MySQL数据库(2)- MySQL Connectors

    欢迎任何形式的转载,但请务必注明出处. 本节内容 mysql connectors介绍 下载安装 在java中配置 点击进入官网下载 一.mysql connectors介绍 mysql connec ...

  3. form-create教程:自定义布局,实现一行多个组件

    本文将介绍form-create如何自定义布局,实现一行多个组件 form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成器.并且支持生成任何 Vue 组 ...

  4. springboot项目命linux环境下命令启动

    测试环境:dev nohup java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 \-Dcom.s ...

  5. Grassfire算法- 运动规划(Motion planning)

     Grassfire算法: 一.概念 这个算法是做图像处理的抽骨架处理,目的是求出图像的骨架,可以想象一片与物体形状相同的草,沿其外围各点同时点火.当火势向内蔓延,向前推进的火线相遇处各点的轨迹就是中 ...

  6. Mysql实现数据库主从复制架构

    MySQL复制 (1)扩展方式: Scale Up ,Scale Out (2)MySQL的扩展 读写分离 复制:每个节点都有相同的数据集 向外扩展 二进制日志 单向 (3)复制的功用: 数据分布 负 ...

  7. 使用Python进行3DES加密-pyDes

    pyDes.py源码 ############################################################################# # Documenta ...

  8. Django ManyToManyField.through_fields 和

    示例: from django.db import models class Person(models.Model): name = models.CharField(max_length=50) ...

  9. asp.net用sql数据库生成json字符串并显示出来

    use Shop ,) )) insert into DictBase select '包装' UNION ALL select '价格' UNION ALL select '品牌' 工厂方法模式 I ...

  10. 2 使用unitest 模块扩展功能测试

    准备做一个 待办事项清单网站,来演示 Web 开发过程中的所有主要步骤.以及如何在各个步骤中运用TDD理念. ”功能测试“: 从用户的角度查看应用是如何运作的. 从某种程度上可以作为应用的说明书. 作 ...