elasticsearch的restful API和Java API

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本人现在使用的是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();

}
}

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1天前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
1天前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
23天前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
76 28
|
5天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
30 5
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
JSON API PHP
CI中如何保护RESTful API
步骤5 保护RESTful API   为了保护RESTful API,可以在application/config/rest.php中设置安全保护级别,如下所示: $config['rest_auth'] = 'basic';    其中保护级别有如下设置:   None:任何人都...
963 0
|
5天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
11天前
|
JSON API 数据格式
微店商品列表接口(微店 API 系列)
微店商品列表接口是微店API系列的一部分,帮助开发者获取店铺中的商品信息。首先需注册微店开发者账号并完成实名认证,选择合适的开发工具如PyCharm或VS Code,并确保熟悉HTTP协议和JSON格式。该接口支持GET/POST请求,主要参数包括店铺ID、页码、每页数量和商品状态等。响应数据为JSON格式,包含商品详细信息及状态码。Python示例代码展示了如何调用此接口。应用场景包括商品管理系统集成、数据分析、多平台数据同步及商品展示推广。
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
25 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡