elasticsearch的restful API和Java API
本人现在使用的是elasticsearch 5.2.1的,服务器IP为192.168.5.182.所以在Java API和jar包中会有所不同.
常用的restful API如下:
http://192.168.5.182:9200/_cat/health?v 健康检查
http://192.168.5.182:9200/_cat/indices?v 查看索引
PUT http://192.168.5.182:9200/test_index?pretty 添加索引
DELETE http://192.168.5.182:9200/test_index 删除索引
PUT http://192.168.5.182:9200/ecommerce/product/1
BODY {
"name":"zhonghua yagao",
"desc":"caoben zhiwu",
"price":40,
"producer":"zhonghua producer",
"tags":["qingxin"]
} 为索引添加数据,ecommerce索引,product type,1 ID
GET http://192.168.5.182:9200/ecommerce/product/1 查询数据
PUT http://192.168.5.182:9200/ecommerce/product/1
BODY {
"name":"jiaqiangban zhonghua yagao",
"desc":"caoben zhiwu",
"price":40,
"producer":"zhonghua producer",
"tags":["qingxin"]
} 更新索引数据,方式一,必须带上所有数据
POST http://192.168.5.182:9200/ecommerce/product/1/_update
BODY {
"doc": {
"name":"gaolujie yagao"
}
} 更新索引数据,方式二
DELETE http://192.168.5.182:9200/ecommerce/product/1 删除索引数据
GET http://192.168.5.182:9200/ecommerce/product/_search 搜索所有
GET http://192.168.5.182:9200/ecommerce/product/_search?q=name:yagao&sort=price:desc
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{"match_all":{}
}
}'
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{"query":{ "match":{ "name":"yagao" } }, "sort":[ {"price":"desc"} ]
}' 排序查询
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{"match_all":{}
},
"from":1,
"size":1
}' 分页查询
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{
"match_all":{}
},
"_source":["name","price"]
}' 只查询指定的字段
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{
"bool":{ "must":{ "match":{ "name":"yagao" } }, "filter":{ "range":{ "price":{ "gt":25 } } } }
}
}' 查询yagao的price范围,大于25
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{"match":{ "producer":"yagao producer" }
}
}' 全文检索
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{
"match_phrase":{
"producer":"yagao producer"
}
}
}' 短语搜索
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"query":{ "match":{ "producer":"producer" } }, "highlight":{ "fields":{ "producer":{} } }
}' 高亮显示
PUT http://192.168.5.182:9200/ecommerce/_mapping/product
BODY {
"properties":{
"tags":{
"type":"text",
"fielddata":true
}
}
} 将文本field的fielddata属性设置为true
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"aggs":{ "group_by_tags":{ "terms":{ "field":"tags" } } }
}' 对tags聚合,会显示明细
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{ "size":0,
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
}
}
}
}' 对tags聚合,不显示明细,只显示聚合
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"size":0,
"query":{"match":{ "name":"yagao" }
},
"aggs":{"group_by_tags":{ "terms":{ "field":"tags" } }
}
}' 搜索包含条件的聚合
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{"size":0, "aggs":{ "group_by_tags":{ "terms":{ "field":"tags" }, "aggs":{ "avg_price":{ "avg":{ "field":"price" } } } } }
}' 聚合计算平均值
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"size":0, "aggs":{ "group_by_tags":{ "terms":{ "field":"tags", "order":{ "avg_price":"desc" } }, "aggs":{ "avg_price":{ "avg":{ "field":"price" } } } } }
}' 聚合后降序排序
curl -XGET 'http://192.168.5.182:9200/ecommerce/product/_search' -d'
{
"size":0,
"aggs":{
"group_by_price":{
"range":{
"field":"price",
"ranges":[
{
"from":0,
"to":20
},
{
"from":20,
"to":40
},
{
"from":40,
"to":60
}
]
},
"aggs":{
"group_by_tags":{
"terms":{
"field":"tags"
},
"aggs":{
"average_price":{
"avg":{
"field":"price"
}
}
}
}
}
}
}
}' 按照价格区间分组后再聚合tags平均价格
PUT http://192.168.5.182:9200/company
BODY {
"mappings": {
"employee": {
"properties": {
"age": {
"type": "long"
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata":true
},
"join_date": {
"type": "date"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"position": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"salary": {
"type": "long"
}
}
}
}
} 给country建立正排索引
在Java API中,我们需要先找到相应的jar包,maven中的配置如下(开始之前请先执行上面的给country建立正排索引的restful API)
org.elasticsearch.client
transport
5.2.1
5.2.1中只需要配这一个就可以了,当然不同的版本配置的都不同,高版本的需要配
org.elasticsearch
elasticsearch
我们依然在resources文件中做如下配置(注意restful API中使用的是9200端口,而Java API使用的是9300端口)
elasticsearch:
clusterName: aubin-cluster
clusterNodes: 192.168.5.182:9300
配置类如下
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig {
private String clusterName;
private String clusterNodes;
/**
* 使用elasticsearch实现类时才触发
*
* @return
*/
@Bean
public TransportClient transportClient() {
// 设置集群名字
Settings settings = Settings.builder().put("cluster.name", this.clusterName).build();
TransportClient client = new PreBuiltTransportClient(settings);
try {
// 读取的ip列表是以逗号分隔的
for (String clusterNode : this.clusterNodes.split(",")) {
String ip = clusterNode.split(":")[0];
String port = clusterNode.split(":")[1];
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(ip), Integer.parseInt(port)));
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
return client;
}
}
在5.2.1中使用的是InetSocketTransportAddress,这是一个具体的类,而在高版本中此处为TransportAddress,这是一个接口.
我们做一个数据类
@Component
public class DataEs {
@Autowired
private TransportClient transportClient;
/**
* 添加原始数据
* @throws IOException
*/
@PostConstruct
private void init() throws IOException {
transportClient.prepareIndex("company","employee","1").setSource(XContentFactory.jsonBuilder().startObject()
.field("name","jack")
.field("age",27)
.field("position","technique software")
.field("country","China")
.field("join_date","2018-01-01")
.field("salary",10000)
.endObject()).get();
transportClient.prepareIndex("company","employee","2").setSource(XContentFactory.jsonBuilder().startObject()
.field("name","marry")
.field("age",35)
.field("position","technique manager")
.field("country","China")
.field("join_date","2018-01-01")
.field("salary",12000)
.endObject()).get();
transportClient.prepareIndex("company","employee","3").setSource(XContentFactory.jsonBuilder().startObject()
.field("name","tom")
.field("age",32)
.field("position","senior technique software")
.field("country","China")
.field("join_date","2017-01-01")
.field("salary",11000)
.endObject()).get();
transportClient.prepareIndex("company","employee","4").setSource(XContentFactory.jsonBuilder().startObject()
.field("name","jen")
.field("age",25)
.field("position","junior finance")
.field("country","USA")
.field("join_date","2017-01-01")
.field("salary",7000)
.endObject()).get();
transportClient.prepareIndex("company","employee","5").setSource(XContentFactory.jsonBuilder().startObject()
.field("name","mike")
.field("age",37)
.field("position","finance manager")
.field("country","USA")
.field("join_date","2016-01-01")
.field("salary",15000)
.endObject()).get();
}
/**
* 员工搜索应用程序
* 搜索职位中包含technique的员工
* 同时要求age在30到40岁之间
* 分页查询,查找第一页
*/
public void executeSearch() {
SearchResponse searchResponse = transportClient.prepareSearch("company")
.setTypes("employee")
.setQuery(QueryBuilders.matchQuery("position", "technique"))
.setPostFilter(QueryBuilders.rangeQuery("age").from(30).to(40))
.setFrom(0).setSize(1)
.get();
SearchHit[] hits = searchResponse.getHits().getHits();
for (int i = 0;i < hits.length;i++) {
System.out.println(hits[i].getSourceAsString());
}
}
/**
* 员工聚合分析应用程序
* 首先按照country国家来进行分组
* 然后在每个country分组内,再按照入职年限进行分组
* 最后计算每个分组内的平均薪资
*/
public void executeAggregation() {
SearchResponse searchResponse = transportClient.prepareSearch("company")
.addAggregation(AggregationBuilders.terms("group_by_country").field("country")
.subAggregation(AggregationBuilders.dateHistogram("group_by_join_date")
.field("join_date").dateHistogramInterval(DateHistogramInterval.YEAR)
.subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))))
.execute().actionGet();
Map<String,Aggregation> aggrMap = searchResponse.getAggregations().asMap();
StringTerms groupByCountry = (StringTerms) aggrMap.get("group_by_country");
Iterator<StringTerms.Bucket> groupByCountryBucketIterator = groupByCountry.getBuckets().iterator();
while (groupByCountryBucketIterator.hasNext()) {
StringTerms.Bucket groupByCountryBucket = groupByCountryBucketIterator.next();
System.out.println(groupByCountryBucket.getKey() + ":" + groupByCountryBucket.getDocCount());
Histogram groupByJoinDate = (Histogram) groupByCountryBucket.getAggregations().asMap().get("group_by_join_date");
Iterator<? extends Histogram.Bucket> groupByJoinDateIterator = groupByJoinDate.getBuckets().iterator();
while (groupByJoinDateIterator.hasNext()) {
Histogram.Bucket groupByJoinDateBucket = groupByJoinDateIterator.next();
System.out.println(groupByJoinDateBucket.getKey() + ":" + groupByJoinDateBucket.getDocCount());
Avg avg = (Avg) groupByJoinDateBucket.getAggregations().asMap().get("avg_salary");
System.out.println(avg.getValue());
}
}
}
public void close() {
transportClient.close();
}
}
在主程序中调用如下(一般我们可以先不执行搜索操作,先注入数据,因为elasticsearch本身有一个秒级写读的问题,如果数据写入,得需要1秒的时间才能读取出来)
@SpringBootApplication
public class EsApplication {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(EsApplication.class, args);
DataEs dataEs = (DataEs) applicationContext.getBean(DataEs.class);
dataEs.executeSearch();
dataEs.executeAggregation();
dataEs.close();
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
iOS objc_msgSend尾调用优化详解
这篇文章将认真彻底地分析 OC对objc_msgSend的尾调用优化。 Q1:什么是尾调用? 尾调用(Tail Call):某个函数的最后一步仅仅只是调用了一个函数(可以是自身,可以是另一个函数)。提醒:注意 “仅仅” 两个字。 尾调用例子: // 尾调用: - (NSInteger)funcA:(NSInteger)num { /* Some codes... */ if (num == 0) { return [self funcA:num];// 尾调用->自身 } if (num > 0) { return [self funcB:num];// 尾调用->函数funcB } return [self funcC:num];// 尾调用->函数funcC } 正例解释:funcA的最后一步仅仅调用了另一个函数。不论是调用funcA、funcB还是funcC都属于尾调用。~(不论调用函数的位置在哪,只要最后一步仅仅调用一个函数就行)~ 反例:不是尾调用的例子 // 不是尾调用1: - (NSInteger)funcA:(NSInteger)num { NS...
-
下一篇
8月30日云栖精选夜读 | 阿里云总监课第二期:如何打造智能语音交互爆款产品?
阿里云总监系列课重磅上线!聚焦人工智能、弹性计算、数据库等热门领域,首次集齐12位阿里云技术高管,耗时半年精心打磨,从理论到实践倾囊相授,从零开始绘制技术大牛成长路径。 第二期《如何打造智能语音交互爆款产品?》特邀阿里云资深算法专家鄢志杰,与志杰老师带领的机器智能技术实验室团队共同为大家带来干货分享。 热点热议 阿里云总监课第二期:如何打造智能语音交互爆款产品? 作者:燕儿199606 谈谈“野生”Java程序员学习的道路! 作者:技术小能手 发表于:Java后端技术 DataOps 助力容量管理 - Project 迁移优化应用实践 作者:技术小能手 发表于:高效运维 知识整理 (十六) 整合spring cloud云架构 -使用spring cloud Bus刷新配置 作者:it芒果 推荐Android两种屏幕适配方案 作者:技术小能手 发表于:终端研发部 间隔调用方法(setInterval与setTimeout) 作者:景凌凯 建站程序--wordpress 作者:景凌凯 嗨!这是一篇值得深入学习的控件-RecyclerView(源码解析篇) 作者:技术小能手 发表于:终端研发...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- 面试大杂烩
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)