`

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客户端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...

    【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权威指南(中文).pdf

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

    ElasticSearch个人详细总结

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

    elasticSearchDemo2.1

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

    java_es交互工具类.rar

    Java REST Client是Elasticsearch官方推荐的客户端,它直接实现了ES的RESTful API,提供了同步和异步两种调用方式。使用Java REST Client的好处在于其简洁和直观,能够方便地处理HTTP请求和响应。 1. **安装与引入*...

Global site tag (gtag.js) - Google Analytics