- 浏览: 334224 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 1226(编写不易,转载请 ... -
Elasticsearch 2.4.2 低延迟使用记录
2018-05-30 18:49 1882编写不易,转载请注明( http://shihle ... -
Elasticsearch集群信息查看及重启维护流程
2018-04-15 13:58 7412编写不易,转载请注明( http://shihlei.it ... -
ElasticSearch 批量条件查询
2018-01-20 15:14 3285编写不易,转载请注明(http://shihlei. ... -
Elastalert 报警框架安装使用
2016-12-23 16:11 7339Elastalert是Yelp公司用python2.6写的 ... -
Elasticsearch2.4 Template 批量操作,条件更新,删除
2016-11-20 18:44 12702编写不易,转载请注明( http://shihlei.i ... -
ElasticSearch2.4.0基于Java API或Java Rest API进行CRUD
2016-10-05 18:53 7255编写不易,转载请注明(http://shihlei.it ... -
ElasticSearch2.4.0单机版及集群安装
2016-09-30 09:38 5115编写不易,转载请注明( http://shihl ...
相关推荐
Jest是的Java HTTP Rest客户端。 ElasticSearch是建立在Apache Lucene之上的开源(Apache 2)分布式RESTful搜索引擎。 ElasticSearch已经有一个Java API,ElasticSearch在内部也使用它,。 阅读IBM Developer...
EsREST 欢迎来到 EsREST。 这是 Elasticsearch REST API 的简单、直接的 Java ...Elasticsearch API 调用使用示例以下是一些基本用法示例: EsREST e = new EsREST("http://localhost:9200");e.createIndex("my-index
Jest是Elasticsearch 的Java Http Rest 客户端,ElasticSearch已经具备应用于Elasticsearch内部的Java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足
Jest是Elasticsearch 的Java Http Rest 客户端。 maven项目直接导入即可。
es相关学习,Jest是ElasticSearch的Java HTTP Rest客户端。 Jest填补了 ElasticSearch 缺少 Http Rest接口 客户端的空白。
ElasticSearch已经具备应用于Elasticsearch内部的java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足。 Jest 配置ES 集群 示例代码 及源码解读 - 核心原理 - NodeChecker源码解读 ...
基于Jest Rest客户端的ElasticSearch的Spring Data实现 将Spring Data与仅可通过HTTP访问的ElasticSearch集群一起使用(例如在AWS上)非常有用。 版本号 Spring数据开玩笑 弹簧靴 弹簧数据弹性搜索 笑话 弹性搜索 ...
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/2.0.0/jest-2.0.0.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/1.0.1/jest-1.0.1.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/0.1.6/jest-0.1.6.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/0.1.4/jest-0.1.4.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/6.3.1/jest-6.3.1.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/2.0.2/jest-2.0.2.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/0.0.3/jest-0.0.3.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/6.3.0/jest-6.3.0.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/1.0.0/jest-1.0.0.jar
ElasticSearch Java REST 客户端 - Apache HTTP 客户端包 io.searchbox/jest/5.3.3/jest-5.3.3.jar
使用 jest,这是一个 Java HTTP Rest 客户端 2. 读取并重建MongoDB 测试mongodb时,使用fongo 2.例如一些servlet 使用 jetty 容器构建 servlet 3. 将数据从mongodb转储到elasticsearch 为了更好的搜索 4.展示部分...
ElasticSearch Java REST 客户端 - Android 库包 io.searchbox/jest-droid/0.1.2/jest-droid-0.1.2.jar
ElasticSearch Java REST 客户端 - Android 库包 io.searchbox/jest-droid/5.3.3/jest-droid-5.3.3.jar