`

Jest:ElasticSearch Java Http Rest 客户端使用

阅读更多

 

编写不易,转载请注明(http://shihlei.iteye.com/blog/2411470)!

一 概述

Jest 是一个Java 版的ElasticSearch Http Rest 客户端,基于HttpClient 封装实现。

 

个人感觉好处:

1 连接池可控

2 简单封装了Bean 到Document 的Mapping过程

 

github:https://github.com/searchbox-io/Jest/tree/master/jest

 

二 环境

(1)版本信息

elasticsearch:elasticsearch-6.2.2.tar.gz

jest:5.3.3

 

(2)环境准备:

a)创建索引

curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/indexdb' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 1,
            "number_of_replicas" : 1
        }
    }
}'

 

b)创建mapping

curl  -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/indexdb/_mapping/docs' -d '{
   "properties": {
      "id": {
            "type": "long",
            "index": "false"
       },
       "title": {
            "type": "keyword",
       },
       "author": {
            "type": "keyword",
       },
       "tags": {
            "type": "keyword",
            "boost" : 3.0,
       },
       "publishTime": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
       }
   }
}'

    注:升级到6.2 mapping 取消string 类型,index 只接受true,false。

 

三 Demo

1)maven 依赖

<!--Java HTTP Rest client for ElasticSearch.-->
        <dependency>
            <groupId>io.searchbox</groupId>
            <artifactId>jest</artifactId>
            <version>5.3.3</version>
        </dependency>

 

2)Bean

package x.search.es.simple.bean;

import java.util.Arrays;
import java.util.Date;

import io.searchbox.annotations.JestId;

public class Document implements Cloneable {
    @JestId
    private long id;
    private String title;
    private String author;
    private String[] tags;
    private Date publishTime;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String[] getTags() {
        return tags;
    }

    public void setTags(String[] tags) {
        this.tags = tags;
    }

    public Date getPublishTime() {
        return publishTime;
    }

    public void setPublishTime(Date publishTime) {
        this.publishTime = publishTime;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Document{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", author='" + author + '\'' +
                ", tags=" + Arrays.toString(tags) +
                ", publishTime=" + publishTime +
                '}';
    }
}

 

3)JestClient 工厂

package x.search.es.simple.jest;

import java.util.Objects;

import com.google.gson.GsonBuilder;
import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;

public class EsJestClient {

    private static final String ES_HOST = "http://127.0.0.1";
    private static final int ES_HTTP_PORT = 9200;

    private static JestClient client;

    /**
     * 获取客户端
     *
     * @return jestclient
     */
    public static synchronized JestClient getClient() {
        if (client == null) {
            build();
        }
        return client;
    }

    /**
     * 关闭客户端
     */
    public static void close(JestClient client) {
        if (!Objects.isNull(client)) {
            try {
                client.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 建立连接
     */
    private static void build() {
        JestClientFactory factory = new JestClientFactory();
        factory.setHttpClientConfig(
                new HttpClientConfig
                        .Builder(ES_HOST + ":" + ES_HTTP_PORT)
                        .multiThreaded(true)
                        //一个route 默认不超过2个连接  路由是指连接到某个远程注解的个数。总连接数=route个数 * defaultMaxTotalConnectionPerRoute
                        .defaultMaxTotalConnectionPerRoute(2)
                        //所有route连接总数
                        .maxTotalConnection(2)
                        .connTimeout(10000)
                        .readTimeout(10000)
                        .gson(new GsonBuilder()
                                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                                .create())
                        .build()
        );
        client = factory.getObject();
    }
}

 

4)CRUD

 

(a)IDocumentDao

package x.search.es.simple;

import x.search.es.simple.bean.Document;

import java.util.List;

public interface IDocumentDao {
    /**
     * 插入
     *
     * @param doc
     * @return
     */
    boolean insert(Document doc);

    /**
     * 替换
     *
     * @param doc
     * @return
     */
    boolean replace(Document doc);

    /**
     * 更新
     *
     * @param doc
     * @return
     */
    boolean update(Document doc);


    /**
     * 删除
     *
     * @param id
     * @return
     */
    boolean delete(long id);

    /**
     * 根据ID查询
     *
     * @param id
     * @return
     */
    Document searchById(long id);

    /**
     * 条件查询
     *
     * @param criterias
     * @return
     */
    List<Document> search(List<Criteria> criterias);

    /**
     * 条件删除
     *
     * @param criterias
     * @return 删除的document数量
     */
    int deleteByQuery(List<Criteria> criterias);
}

 

(b)Criteria 

package x.search.es.simple;

public class Criteria {
    private String fieldName;
    private Object fieldValue;

    public Criteria(String fieldName, Object fieldValue) {
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    public String getFieldName() {
        return fieldName;
    }

    public Object getFieldValue() {
        return fieldValue;
    }
}

 (c)DocumentDB

package x.search.es.simple;

public class  DocumentDB {
    //indices 名必须小写
    public static final String INDICES = "indexdb";
    // type 名必须小写
    public static final String TYPE = "docs";
}

 

 (d)DocumentJestDaoImpl

package x.search.es.simple.jest;

import java.util.Date;
import java.util.List;

import io.searchbox.client.JestClient;
import io.searchbox.client.JestResult;
import io.searchbox.core.Delete;
import io.searchbox.core.DeleteByQuery;
import io.searchbox.core.DocumentResult;
import io.searchbox.core.Get;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import io.searchbox.core.Update;
import io.searchbox.core.UpdateByQuery;
import io.searchbox.core.UpdateByQueryResult;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import x.search.es.simple.Criteria;
import x.search.es.simple.DocumentDB;
import x.search.es.simple.IDocumentDao;
import x.search.es.simple.bean.Document;

public class DocumentJestDaoImpl implements IDocumentDao {

    private JestClient client;

    private DocumentJestDaoImpl(JestClient client) {
        this.client = client;
    }

    public static void main(String[] args) {
        JestClient client = EsJestClient.getClient();
        DocumentJestDaoImpl documentDao = new DocumentJestDaoImpl(client);

        Document document = new Document();
        document.setId(1);
        document.setTitle("foo");
        document.setAuthor("bar");
        document.setPublishTime(new Date());
        document.setTags(new String[]{"tag1", "tag2", "tag3", "tag4"});

        //保存
        documentDao.insert(document);
        System.out.println(documentDao.searchById(1));
    }

    /**
     * 插入
     *
     * @param doc 文档
     * @return 是佛插入成功
     */
    @Override
    public boolean insert(Document doc) {
        try {
            DocumentResult result = client.execute(new Index.Builder(doc)
                    .index(DocumentDB.INDICES)
                    .type(DocumentDB.TYPE)
                    .refresh(true)
                    .build());
            return result.isSucceeded();
        } catch (Exception e) {
            throw new RuntimeException("insert exception", e);
        }
    }

    /**
     * 替换
     *
     * @param doc 文档
     * @return 是否执行成功
     */
    @Override
    public boolean replace(Document doc) {
        return update(doc);
    }

    /**
     * 更新
     *
     * @param doc 文档
     * @return 是否更新成功
     */
    @Override
    public boolean update(Document doc) {
        try {
            DocumentResult result = client.execute(new Update.Builder(doc)
                    .index(DocumentDB.INDICES)
                    .type(DocumentDB.TYPE)
                    .refresh(true)
                    .build());
            return result.isSucceeded();
        } catch (Exception e) {
            throw new RuntimeException("update exception", e);
        }
    }

    /**
     * 删除
     *
     * @param id 文档id
     * @return 是否执行成功
     */
    @Override
    public boolean delete(long id) {
        try {
            DocumentResult result = client.execute(new Delete.Builder(String.valueOf(id))
                    .index(DocumentDB.INDICES)
                    .type(DocumentDB.TYPE)
                    .build());
            return result.isSucceeded();
        } catch (Exception e) {
            throw new RuntimeException("delete exception", e);
        }
    }

    /**
     * 根据ID查询
     *
     * @param id id
     * @return 文档
     */
    @Override
    public Document searchById(long id) {
        try {
            DocumentResult result = client.execute(new Get.Builder(DocumentDB.INDICES, String.valueOf(id))
                    .type(DocumentDB.TYPE)
                    .build());
            return result.getSourceAsObject(Document.class);
        } catch (Exception e) {
            throw new RuntimeException("searchById exception", e);
        }
    }

    /**
     * 条件查询
     *
     * @param criterias 条件列表
     * @return 结果集
     */
    @Override
    public List<Document> search(List<Criteria> criterias) {
        try {
            SearchResult result = client.execute(new Search.Builder(buildSearch(criterias).toString())
                    // multiple index or types can be added.
                    .addIndex(DocumentDB.INDICES)
                    .addType(DocumentDB.TYPE)
                    .build());
            return result.getSourceAsObjectList(Document.class, false);

        } catch (Exception e) {
            throw new RuntimeException("search exception", e);
        }
    }

    private SearchSourceBuilder buildSearch(List<Criteria> criterias) {
        //指定查询的库表
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        if (criterias != null && !criterias.isEmpty()) {
            //构建查询条件必须嵌入filter中!
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            for (Criteria c : criterias) {
                boolQueryBuilder.filter(QueryBuilders.termQuery(c.getFieldName(), c.getFieldValue()));
            }

            searchSourceBuilder.query(boolQueryBuilder);
        }
        return searchSourceBuilder;
    }
    /**
     * 条件删除 ,ElasticSearch V5.1 以上可用
     *
     * @param criterias 条件
     * @return 删除的document数量
     */
    @Override
    public int deleteByQuery(List<Criteria> criterias) {
        try {
            JestResult result = client.execute(new DeleteByQuery.Builder(buildSearch(criterias).toString())
                    .addIndex(DocumentDB.INDICES)
                    .addType(DocumentDB.TYPE)
                    .build());

            return result.getJsonObject().get("deleted").getAsInt();
        } catch (Exception e) {
            throw new RuntimeException("deleteByQuery exception", e);
        }
    }
}

 

附录:

1)elasticsearch 6.2 安装

(1)下载解压

 

cd /opt/
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz
tar -xvf elasticsearch-6.2.2.tar.gz
 

 

(2)创建用户

 

groupadd es
useradd -r -g es -s /bin/bash es
chown -hR es:es /opt/elasticsearch-6.2.2
 

 

(3)启动

su es
cd /opt/elasticsearch-6.2.2/bin
./elasticsearch

 

分享到:
评论

相关推荐

    Jest:Elasticsearch Java Rest客户端

    Jest是的Java HTTP Rest客户端。 ElasticSearch是建立在Apache Lucene之上的开源(Apache 2)分布式RESTful搜索引擎。 ElasticSearch已经有一个Java API,ElasticSearch在内部也使用它,。 阅读IBM Developer...

    Elasticsearch Java Rest 客户端 .zip

    ElasticSearch 已经有一个 Java API,它也被 ElasticSearch 内部使用,但是 Jest 填补了一个空白,它是 ElasticSearch Http Rest 接口缺失的客户端。阅读 IBM Developer 作品中有关 ElasticSearch 和 Jest 的精彩...

    Elasticsearch之Java客户端Jest的全部依赖jar包

    这包括Jest核心库、Elasticsearch的Java REST客户端依赖以及可能的其他辅助库,例如HTTP客户端、Gson用于JSON序列化和反序列化等。 2. 配置连接:创建JestClient实例,指定Elasticsearch集群的地址。这可以通过提供...

    esrest:ElasticSearch REST API 的简单直接的 Java 客户端

    EsREST 欢迎来到 EsREST。 这是 Elasticsearch REST API 的简单、直接的 Java ...Elasticsearch API 调用使用示例以下是一些基本用法示例: EsREST e = new EsREST("http://localhost:9200");e.createIndex("my-index

    ES查询客户端,elasticsearch可视化工具 elasticsearch查询客户端

    - **Jest**:一个轻量级的Java REST客户端,易于集成到Java项目中,支持HTTP JSON协议。 - **Elasticsearch-JDBC**:允许将Elasticsearch作为数据源,与SQL兼容的系统进行集成。 - **Python Elasticsearch Client**...

    Elasticsearch Java Rest Client..zip

    总结,Elasticsearch Java REST 客户端,尤其是 Jest 客户端,为 Java 开发者提供了一种便捷、灵活的与 Elasticsearch 集群交互的方式。通过熟练掌握它的使用,我们可以轻松地在应用程序中集成全文搜索和数据分析...

    es-Jest实战

    Jest是Elasticsearch 的Java Http Rest 客户端,ElasticSearch已经具备应用于Elasticsearch内部的Java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足

    用jest客户端将数据从hive导入elasticsearch

    Jest是一个Java REST客户端,它为Elasticsearch提供了一个简单易用的接口。以下是这个过程的详细步骤和相关知识点: 1. **Jest使用示例** Jest客户端通过HTTP协议与Elasticsearch节点通信,提供了一种方便的方式来...

    elasticsearch RESTful搜索引擎-(java jest 使用[入门])

    Jest是Java开发者的Elasticsearch REST客户端,它封装了与Elasticsearch通信的细节,使得开发者可以更专注于业务逻辑。主要特性包括: 1. **简单API**:Jest提供了简洁的API,用于执行各种Elasticsearch操作,如...

    es相关学习

    es相关学习,Jest是ElasticSearch的Java HTTP Rest客户端。 Jest填补了 ElasticSearch 缺少 Http Rest接口 客户端的空白。

    Jest-5.3.4.zip

    ElasticSearch已经具备应用于Elasticsearch内部的java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足。 Jest 配置ES 集群 示例代码 及源码解读 - 核心原理 - NodeChecker源码解读 ...

    jest-client.7z

    Jest是一个轻量级的Java REST客户端,用于与Elasticsearch服务器通信。它支持Elasticsearch的所有主要API,包括索引、搜索、更新和删除操作。Jest通过简洁的API设计,使得开发者能更轻松地集成Elasticsearch到Java...

    SpringBoot 集成ElasticSearch两个依赖的jar

    Jest是一个轻量级的、基于HTTP/JSON的Elasticsearch Java REST客户端。它提供了简单易用的API,可以用来执行各种Elasticsearch操作。如果你的项目需要更底层的控制或者有特殊需求,可以考虑使用Jest。添加Jest依赖...

    elasticsearch结合spring springmvc jest 使用做成WEB架构

    Jest是一个轻量级的Java REST客户端,用于与Elasticsearch通信。它提供了简单易用的API,可以方便地在Java应用中调用Elasticsearch的各种API。将Jest与Spring MVC结合,可以帮助我们实现在Web应用中直接操作Elastic...

    Elasticsearch权威指南(中文).pdf

    1. **JEST客户端**:简洁易用的Java REST客户端,与Elasticsearch的RESTful API紧密对接。 2. **Transport客户端**:直接通过Elasticsearch的内部传输协议进行通信,性能较好,但配置相对复杂。 3. **High-Level ...

    【JEST连接ES(6.0)进行增删改查】

    而Jest则是Java的一个REST客户端库,用于与Elasticsearch服务器通信,它使得在Java应用中执行Elasticsearch的操作变得简单直接。本文将详细讲解如何在JDK 1.8环境下,利用JEST 5.0以上版本与ES 6.0以上版本进行增删...

    Elasticsearch学习资料整理

    - **Jest**:一个第三方的Java HTTP REST客户端,提供了丰富的API和POJO映射功能。 7. **安全与权限控制** - **Shield插件**:在Elasticsearch 2.x中用于安全管理,基础认证免费。 - **x-pack**:Elasticsearch ...

    ElasticSearch个人详细总结

    5. **Jest**:一个基于 Java 的 Elasticsearch REST 客户端,提供简单的异步 API。 每种客户端都有其适用场景,根据项目需求选择合适的连接方式。 **测试 IK 分词效果** 可以使用 Elasticsearch 的 `_analyze` ...

    elasticSearchDemo2.1

    3. **Jest客户端**:Jest是一个Java REST客户端,用于与Elasticsearch服务器通信。它简化了发送HTTP请求的过程,提供了更直观的方式来执行Elasticsearch的操作,如索引文档、搜索、管理索引等。在这个项目中,Jest...

Global site tag (gtag.js) - Google Analytics