Elasticsearch的CRUD:REST与Java API
CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建、查询、更改、删除,俗称“增删改查”。Elasticsearch作为NoSQL数据库(虽然ES是为搜索引擎而生的,但我更愿意将其看作带有强大文本搜索功能的NoSQL)。
以下示例基于Elasticsearch 2.4版本。
Create
在默认情况下,ES的REST接口的端口号为9200,对接Java client的端口号为9300。
Create操作为向index中索引文档,若index不存在则ES会自动创建;
$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{<json data>}'
Java API("org.elasticsearch" % "elasticsearch" % "2.4.1")通过TransportClient
与ES集群连接,CRUD操作便是基于此而实现的。
final Settings settings = Settings.settingsBuilder()
.put("client.transport.sniff", true)
.put("client.transport.ping_timeout", 20, TimeUnit.SECONDS)
.put("client", true)
.put("data", false)
.put("cluster.name", "<cluster name>")
.build();
Client client = TransportClient.builder()
.settings(settings).build()
.addTransportAddresses(
new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300),
new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
Index Java API创建index或索引document:
import org.elasticsearch.action.index.IndexResponse;
IndexResponse response = client.prepareIndex("twitter", "tweet")
.setSource(documentJson)
.get();
Retrieve
ES的查询DSL大致可以分为两种:
- Query DSL,主要配合bool、match等使用,相当于SQL中的where子句;
- Aggregations,相当于SQL中的group by部分,细分为如下三类:
- Bucketing,聚合函数只能是
count(*)
,表示的是doc命中数,可以嵌套子aggs; - Metric,相比于Bucketing其非常灵活,可配合
avg
、max
、sum
等聚合函数,但是不能嵌套子aggs; - Pipeline,以其他aggs的结果作为输入,而不是直接在文档集合上进行操作。
ES的Query DSL功能实在是强大,在本文短短的篇幅中很难阐述完全,故只列举了两个简单实例。在以前的项目中,我使用过1.7
版本ES,后来发现2.0.0-beta1
版本及之后DSL语法发生很大的变化,比如filtered
、and
、or
等被废弃掉了,而被bool
取而代之;对应的Java API支持链式操作,与Java 8配合写起来非常舒服。
REST通过_search
接口进行DSL查询:
$ curl -XGET 'localhost:9200/<index>/_search?pretty' -d'{<dsl>}'
实战:List<List<String>> idsList
作为过滤条件,其中内一层为and关系、内二层为or关系;然后多字段(为bucketSizeMap
的key)aggs,Java 8实现:
BoolQueryBuilder mustQueryBuilder = boolQuery();
if (!(idsList.size() == 1 && idsList.get(0).isEmpty())) {
mustQueryBuilder = idsList.stream().reduce(
boolQuery(),
(mustQB, ids) -> {
BoolQueryBuilder shouldQB = ids.stream().reduce(boolQuery(),
(qb, id) -> qb.should(termQuery(SearchSystem.getEsType(id, idMap), id)),
BoolQueryBuilder::should);
return mustQB.must(shouldQB);
},
BoolQueryBuilder::must);
}
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(indexName)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(mustQueryBuilder);
for (Map.Entry<String, Integer> entry : bucketSizeMap.entrySet()) {
AggregationBuilder aggregationBuilder = AggregationBuilders
.terms(entry.getKey())
.field(entry.getKey()).size(entry.getValue());
searchRequestBuilder.addAggregation(aggregationBuilder);
}
SearchResponse response = searchRequestBuilder.execute().actionGet();
Bucket Aggregations支持filter aggs,即满足过滤条件后做aggs,
aggs:
<aggs_name>:
filter:
aggs:
其与filter query + aggs在功能上是等价的,
query:
bool:
filter:
aggs:
但是,经测试发现filter query + aggs是比filter aggs查询要快。
Update
update为document级别的操作,即仅支持对某个具体document进行更新;REST通过_update
接口:
$ curl -XPOST 'localhost:9200/<_index>/<_type>/<_id>/_update' -d '{<data>}'
Java API则有两种实现方式:UpdateRequest
+ update
与prepareUpdate
,
// case 1
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index("index");
updateRequest.type("type");
updateRequest.id("1");
updateRequest.doc(jsonBuilder()
.startObject()
.field("gender", "male")
.endObject());
client.update(updateRequest).get();
// case 2
client.prepareUpdate("ttl", "doc", "1")
.setDoc(jsonBuilder()
.startObject()
.field("gender", "male")
.endObject())
.get();
Delete
delete操作通常都伴随着检查index是否存在(exist),exist的RESTful接口与Java API分别如下:
$ curl -XHEAD -i 'http://localhost:9200/twitter'
client.admin().indices()
.prepareExists(indexName)
.execute().actionGet().isExists();
ES提供了三种粗细粒度的删除操作:
- 删除整个index;
- 删除index中某一type;
- 删除特定的document.
RESTful接口:
-- delete complete index
$ curl -XDELETE 'http://localhost:9200/<indexname>'
-- delete a type in index
$ curl -XDELETE 'http://localhost:9200/<indexname>/<typename>'
-- delete a particular document
$ curl -XDELETE 'http://localhost:9200/<indexname>/<typename>/<documentId>
Java API实现:
// delete complete index
client.admin().indices().delete(new DeleteIndexRequest("<indexname>")).actionGet();
// delete a type in index
client.prepareDelete().setIndex("<indexname>").setType("<typename>").setId("*").execute().actionGet();
// delete a particular document
client.prepareDelete().setIndex("<indexname>").setType("<typename>").setId("<documentId>").execute().actionGet();
// or
DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")
.execute()
.actionGet();
Elasticsearch的CRUD:REST与Java API的更多相关文章
- Elasticsearch 5.4.3实战--Java API调用:索引mapping创建
因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理, 所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...
- elasticsearch(一):JAVA api操作
1.创建一个mavan项目,项目的以来配置如下. <?xml version="1.0" encoding="UTF-8"?> <projec ...
- Elasticsearch 5.4.3实战--Java API调用:搜索建议
通常的搜索引擎,都会根据用户的输入,实时给予匹配的提示. 那么这个功能在elasticsearch中如何实现呢? Elasticsearch里设计了4种类别的Suggester,分别是: Term S ...
- Elasticsearch 5.4.3实战--Java API调用:搜索
ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...
- Elasticsearch 5.4.3实战--Java API调用:批量写入数据
这个其实比较简单,直接上代码. 注意部分逻辑可以换成你自己的逻辑 package com.cs99lzzs.elasticsearch.service.imp; import java.sql.Tim ...
- ElasticSearch入门-增删改查(java api)
1.增加Index PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(g ...
- [搜索]ElasticSearch Java Api(一) -添加数据创建索引
转载:http://blog.csdn.net/napoay/article/details/51707023 ElasticSearch JAVA API官网文档:https://www.elast ...
- Elasticsearch 2.3.3 JAVA api说明文档
原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...
- 第08章 ElasticSearch Java API
本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...
随机推荐
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- C# 利用性能计数器监控网络状态
本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器 ...
- category中重写方法?
问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航
ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...
- Lind.DDD.LindMQ~关于持久化到Redis的消息格式
回到目录 关于持久化到Redis的消息格式,主要是说在Broker上把消息持久化的过程中,需要存储哪些类型的消息,因为我们的消息是分topic的,而每个topic又有若干个queue组成,而我们的to ...
- Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...
- Android中的flexboxlayout布局
提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...
- Android 微信第三方登录(个人笔记)
今天在写微信登录,花了半天时间搞定.然后写下自己的笔记,希望帮助更多的人...欢迎各位指教. 微信授权登录,官方说的不是很清楚.所以导致有一部分的坑. 微信注册应用平台的应用签名,下载 微信签名生成工 ...
- 网站缓存技术总结( ehcache、memcache、redis对比)
网站技术高速发展的今天,缓存技术已经成为大型网站的一个关键技术,缓存设计好坏直接关系的一个网站访问的速度,以及购置服务器的数量,甚至影响到用户的体验. 网站缓存按照存放的地点不同,可以分为客户端缓存. ...
- 智能头盔 "Livall携全球首款智能骑行头盔亮相CES"
LIVALL是全球首创集音乐.通讯.智能灯光为一体的智能骑行头盔的研发者,日前Livall携旗下智能骑行头盔BH 100和BH 60参展CES 2017,这也是目前世全球首款智能骑行头盔类产品,同时亮 ...