- 浏览: 339062 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u013430438:
图文并茂
EGit(Git Eclipse Plugin)使用 -
1927105:
赞挺实用的
JOL:查看Java 对象布局、大小工具 -
ShihLei:
wangming520liwei 写道上面的HA 架构图是不是 ...
Hadoop-2.3.0-cdh5.0.1完全分布式环境搭建(NameNode,ResourceManager HA) -
wangming520liwei:
上面的HA 架构图是不是来自 某个官网? 想问下还记得地址么 ...
Hadoop-2.3.0-cdh5.0.1完全分布式环境搭建(NameNode,ResourceManager HA) -
ShihLei:
jxjxtang 写道public TimeV1MicroSe ...
SpringCloud(二):声明式RestClient—Feign
Jest:ElasticSearch Java Http Rest 客户端使用
- 博客分类:
- Search
一 概述
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
发表评论
-
ElasticSearch NodeQueryCache使用及Lucene QueryCache分析
2018-10-28 17:01 1312(编写不易,转载请 ... -
Elasticsearch 2.4.2 低延迟使用记录
2018-05-30 18:49 1945编写不易,转载请注明( http://shihle ... -
Elasticsearch集群信息查看及重启维护流程
2018-04-15 13:58 7537编写不易,转载请注明( http://shihlei.it ... -
ElasticSearch 批量条件查询
2018-01-20 15:14 3356编写不易,转载请注明(http://shihlei. ... -
Elastalert 报警框架安装使用
2016-12-23 16:11 7418Elastalert是Yelp公司用python2.6写的 ... -
Elasticsearch2.4 Template 批量操作,条件更新,删除
2016-11-20 18:44 12826编写不易,转载请注明( http://shihlei.i ... -
ElasticSearch2.4.0基于Java API或Java Rest API进行CRUD
2016-10-05 18:53 7334编写不易,转载请注明(http://shihlei.it ... -
ElasticSearch2.4.0单机版及集群安装
2016-09-30 09:38 5178编写不易,转载请注明( http://shihl ...
相关推荐
Jest是的Java HTTP Rest客户端。 ElasticSearch是建立在Apache Lucene之上的开源(Apache 2)分布式RESTful搜索引擎。 ElasticSearch已经有一个Java API,ElasticSearch在内部也使用它,。 阅读IBM Developer...
这包括Jest核心库、Elasticsearch的Java REST客户端依赖以及可能的其他辅助库,例如HTTP客户端、Gson用于JSON序列化和反序列化等。 2. 配置连接:创建JestClient实例,指定Elasticsearch集群的地址。这可以通过提供...
EsREST 欢迎来到 EsREST。 这是 Elasticsearch REST API 的简单、直接的 Java ...Elasticsearch API 调用使用示例以下是一些基本用法示例: EsREST e = new EsREST("http://localhost:9200");e.createIndex("my-index
- **Jest**:一个轻量级的Java REST客户端,易于集成到Java项目中,支持HTTP JSON协议。 - **Elasticsearch-JDBC**:允许将Elasticsearch作为数据源,与SQL兼容的系统进行集成。 - **Python Elasticsearch Client**...
总结,Elasticsearch Java REST 客户端,尤其是 Jest 客户端,为 Java 开发者提供了一种便捷、灵活的与 Elasticsearch 集群交互的方式。通过熟练掌握它的使用,我们可以轻松地在应用程序中集成全文搜索和数据分析...
Jest是Elasticsearch 的Java Http Rest 客户端,ElasticSearch已经具备应用于Elasticsearch内部的Java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足
Jest是一个Java REST客户端,它为Elasticsearch提供了一个简单易用的接口。以下是这个过程的详细步骤和相关知识点: 1. **Jest使用示例** Jest客户端通过HTTP协议与Elasticsearch节点通信,提供了一种方便的方式来...
Jest是Java开发者的Elasticsearch REST客户端,它封装了与Elasticsearch通信的细节,使得开发者可以更专注于业务逻辑。主要特性包括: 1. **简单API**:Jest提供了简洁的API,用于执行各种Elasticsearch操作,如...
es相关学习,Jest是ElasticSearch的Java HTTP Rest客户端。 Jest填补了 ElasticSearch 缺少 Http Rest接口 客户端的空白。
ElasticSearch已经具备应用于Elasticsearch内部的java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足。 Jest 配置ES 集群 示例代码 及源码解读 - 核心原理 - NodeChecker源码解读 ...
Jest是一个轻量级的Java REST客户端,用于与Elasticsearch服务器通信。它支持Elasticsearch的所有主要API,包括索引、搜索、更新和删除操作。Jest通过简洁的API设计,使得开发者能更轻松地集成Elasticsearch到Java...
Jest是一个轻量级的、基于HTTP/JSON的Elasticsearch Java REST客户端。它提供了简单易用的API,可以用来执行各种Elasticsearch操作。如果你的项目需要更底层的控制或者有特殊需求,可以考虑使用Jest。添加Jest依赖...
Jest是一个轻量级的Java REST客户端,用于与Elasticsearch通信。它提供了简单易用的API,可以方便地在Java应用中调用Elasticsearch的各种API。将Jest与Spring MVC结合,可以帮助我们实现在Web应用中直接操作Elastic...
而Jest则是Java的一个REST客户端库,用于与Elasticsearch服务器通信,它使得在Java应用中执行Elasticsearch的操作变得简单直接。本文将详细讲解如何在JDK 1.8环境下,利用JEST 5.0以上版本与ES 6.0以上版本进行增删...
- **Jest**:一个第三方的Java HTTP REST客户端,提供了丰富的API和POJO映射功能。 7. **安全与权限控制** - **Shield插件**:在Elasticsearch 2.x中用于安全管理,基础认证免费。 - **x-pack**:Elasticsearch ...
1. **JEST客户端**:简洁易用的Java REST客户端,与Elasticsearch的RESTful API紧密对接。 2. **Transport客户端**:直接通过Elasticsearch的内部传输协议进行通信,性能较好,但配置相对复杂。 3. **High-Level ...
5. **Jest**:一个基于 Java 的 Elasticsearch REST 客户端,提供简单的异步 API。 每种客户端都有其适用场景,根据项目需求选择合适的连接方式。 **测试 IK 分词效果** 可以使用 Elasticsearch 的 `_analyze` ...
3. **Jest客户端**:Jest是一个Java REST客户端,用于与Elasticsearch服务器通信。它简化了发送HTTP请求的过程,提供了更直观的方式来执行Elasticsearch的操作,如索引文档、搜索、管理索引等。在这个项目中,Jest...
Java REST Client是Elasticsearch官方推荐的客户端,它直接实现了ES的RESTful API,提供了同步和异步两种调用方式。使用Java REST Client的好处在于其简洁和直观,能够方便地处理HTTP请求和响应。 1. **安装与引入*...