ElasticSearch Java API

  • 第 2 章 ElasticSearch 入门
    • JavaAPI - 环境准备
    • JavaAPI - 索引操作
      • 创建索引
      • 查询索引
      • 删除索引
    • JavaAPI - 文档基本操作
      • 重构
      • 新增文档
      • 修改文档
      • 查询文档
      • 删除文档
      • 批量新增
      • 批量删除
    • JavaAPI - 文档高级查询
      • 封装
      • 全量查询
      • 条件查询
      • 分页查询
      • 查询排序
      • 组合查询
      • 范围查询
      • 模糊查询
      • 高亮查询
      • 最大值查询
      • 分组查询

学习视频:ElasticSearch 教程入门到精通(基于 ELK 技术栈 elasticsearch 7.8.x 版本)

学习大纲:

  • 第 1 章 Elasticsearch 概述
  • 第 2 章 Elasticsearch 入门
  • 第 3 章 Elasticsearch 环境
  • 第 4 章 Elasticsearch 进阶
  • 第 5 章 Elasticsearch 集成
  • 第 6 章 Elasticsearch 优化
  • 第 7 章 Elasticsearch 面试题

第 2 章 ElasticSearch 入门

JavaAPI - 环境准备

新建一个 Maven 工程,添加以下依赖:

<dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 的客户端 --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 依赖 2.x 的 log4j --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version></dependency><!-- junit 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency>
</dependencies>

HelloElasticsearch

import java.io.IOException;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class HelloElasticsearch {public static void main(String[] args) throws IOException {// 创建客户端对象RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));//     ...System.out.println(client);// 关闭客户端连接client.close();}
}

JavaAPI - 索引操作

创建索引

import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;import java.io.IOException;public class CreateIndex {public static void main(String[] args) throws IOException {// 创建客户端对象RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 创建索引 - 请求对象CreateIndexRequest request = new CreateIndexRequest("user");// 发送请求,获取响应CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);boolean acknowledged = response.isAcknowledged();// 响应状态System.out.println("操作状态 = " + acknowledged);// 关闭客户端连接client.close();}
}

查询索引

public class SearchIndex {public static void main(String[] args) throws IOException {// 创建客户端对象RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 查询索引 - 请求对象GetIndexRequest request = new GetIndexRequest("user");// 发送请求,获取响应GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);System.out.println("aliases:" + response.getAliases());System.out.println("mappings:" + response.getMappings());System.out.println("settings:" + response.getSettings());client.close();}
}

控制台输出:

aliases:{user=[]}
mappings:{user=org.elasticsearch.cluster.metadata.MappingMetadata@e9e63037}
settings:{user={"index.creation_date":"1646888783599","index.number_of_replicas":"1","index.number_of_shards":"1","index.provided_name":"user","index.uuid":"uN9XtaJBT2O_sjwMdH06MQ","index.version.created":"7080099"}}

删除索引

public class DeleteIndex {public static void main(String[] args) throws IOException {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));// 删除索引 - 请求对象DeleteIndexRequest request = new DeleteIndexRequest("user");// 发送请求,获取响应AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);// 操作结果System.out.println("操作结果:" + response.isAcknowledged());client.close();}
}

控制台输出:

操作结果:true

JavaAPI - 文档基本操作

重构

对 ElasticSearch 的连接和关闭进行重构:

import org.elasticsearch.client.RestHighLevelClient;@FunctionalInterface
public interface ElasticsearchTask {void doSomething(RestHighLevelClient client) throws Exception;
}
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;public class ConnectElasticsearch {public static void connect(ElasticsearchTask task) {// 创建客户端对象,并自动关闭连接try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")))) {task.doSomething(client);} catch (Exception e) {e.printStackTrace();}}
}

想要 ElasticSearch 完成一些操作,只要编写一个 lambda 即可:

public class SomeClass {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {//do something});}
}

新增文档

import com.fasterxml.jackson.databind.ObjectMapper;
import com.yu.es.test.model.User;
import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;public class InsertDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 新增文档 - 请求对象IndexRequest request = new IndexRequest();// 设置索引及唯一性标识request.index("user").id("1001");// 创建数据对象User user = new User();user.setName("zhangsan");user.setAge(30);user.setSex("男");// Model -> JSONObjectMapper objectMapper = new ObjectMapper();String productJson = objectMapper.writeValueAsString(user);// 添加文档数据,数据格式为 JSON 格式request.source(productJson, XContentType.JSON);// 客户端发送请求,获取响应对象IndexResponse response = client.index(request, RequestOptions.DEFAULT);// 打印结果信息System.out.println("_index:" + response.getIndex());System.out.println("_id:" + response.getId());System.out.println("_result:" + response.getResult());});}
}

控制台输出:

_index:user
_id:1001
_result:CREATED

修改文档

import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;public class UpdateDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 修改文档 - 请求对象UpdateRequest request = new UpdateRequest();// 配置修改参数request.index("user").id("1001");// 设置请求体,对数据进行修改request.doc(XContentType.JSON, "sex", "女");// 客户端发送请求,获取响应对象UpdateResponse response = client.update(request, RequestOptions.DEFAULT);System.out.println("_index:" + response.getIndex());System.out.println("_id:" + response.getId());System.out.println("_result:" + response.getResult());});}
}

控制台输出:

_index:user
_id:1001
_result:UPDATED

查询文档

import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;public class GetDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 1.创建请求对象GetRequest request = new GetRequest().index("user").id("1001");// 2.客户端发送请求,获取响应对象GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.打印结果信息System.out.println("_index:" + response.getIndex());System.out.println("_type:" + response.getType());System.out.println("_id:" + response.getId());System.out.println("source:" + response.getSourceAsString());});}
}

控制台输出:

_index:user
_type:_doc
_id:1001
source:{"name":"zhangsan","sex":"女","age":30}

删除文档

import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.client.RequestOptions;public class DeleteDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 1.创建请求对象DeleteRequest request = new DeleteRequest().index("user").id("1001");// 2.客户端发送请求,获取响应对象DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);// 3.打印信息System.out.println(response.toString());});}
}

控制台输出:

DeleteResponse[index=user,type=_doc,id=1001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

批量新增

import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;public class BatchInsertDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 创建批量新增请求对象BulkRequest request = new BulkRequest();request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", 30));request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi"));request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu"));// 客户端发送请求,获取响应对象BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);// 打印结果信息System.out.println("took:" + responses.getTook());System.out.println("items:" + responses.getItems());});}
}

批量删除

import com.yu.es.test.utils.ConnectElasticsearch;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.client.RequestOptions;public class BatchDelDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 创建批量删除请求对象BulkRequest request = new BulkRequest();request.add(new DeleteRequest().index("user").id("1001"));request.add(new DeleteRequest().index("user").id("1002"));request.add(new DeleteRequest().index("user").id("1003"));// 客户端发送请求,获取响应对象BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);// 打印结果信息System.out.println("took:" + responses.getTook());System.out.println("items:" + responses.getItems());});}
}

JavaAPI - 文档高级查询

注意:

  • matchQuery 分词搜索
  • termQuery 完全匹配搜索

先批量新增数据:

public class BatchInsertDoc {public static void main(String[] args) {ConnectElasticsearch.connect(client -> {// 创建批量新增请求对象BulkRequest request = new BulkRequest();request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", "10", "sex", "女"));request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", "30", "sex", "女"));request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu1", "age", "40", "sex", "男"));request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu2", "age", "20", "sex", "女"));request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu3", "age", "50", "sex", "男"));request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu4", "age", "20", "sex", "男"));// 客户端发送请求,获取响应对象BulkResponse responses = client.bulk(request, RequestOptions.DEFAULT);// 打印结果信息System.out.println("took:" + responses.getTook());System.out.println("items:" + responses.getItems());});}
}

封装

以下操作基本模板都是一样的,不同的就是各种查询的构建过程不同:

// 创建搜索请求对象
SearchRequest request = new SearchRequest();
request.indices("user");// 构建查询的请求体
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 构建....
// 这一块的代码需要根据具体需求来写// 输出查询结果
SearchHits hits = response.getHits();
System.out.println("took:" + response.getTook());
System.out.println("timeout:" + response.isTimedOut()); // 是否超时
System.out.println("total:" + hits.getTotalHits()); // 查询到数据总数
System.out.println("MaxScore:" + hits.getMaxScore());
System.out.println("hits========>>");
// 输出每条查询的结果信息
for (SearchHit hit : hits)System.out.println(hit.getSourceAsString());
System.out.println("<<========");

因此我们将该过程封装一下:

public class QueryDoc {@FunctionalInterfacepublic interface QueryBuild {void doBuild(SearchRequest request, SearchSourceBuilder sourceBuilder) throws IOException;}public static void doQuery(RestHighLevelClient client, QueryBuild build) throws IOException {// 创建搜索请求对象SearchRequest request = new SearchRequest();request.indices("user");// 构建查询的请求体SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 请求体的构建由调用者进行build.doBuild(request, sourceBuilder);request.source(sourceBuilder);SearchResponse response = client.search(request, RequestOptions.DEFAULT);// 结果输出SearchHits hits = response.getHits();System.out.println("took:" + response.getTook());System.out.println("timeout:" + response.isTimedOut());System.out.println("total:" + hits.getTotalHits());System.out.println("MaxScore:" + hits.getMaxScore());System.out.println("hits========>>");// 输出每条查询的结果信息for (SearchHit hit : hits)System.out.println(hit.getSourceAsString());System.out.println("<<========");}
}

使用方法:(后面的示例省略 main 方法中调用)

public static final ElasticsearchTask SEARCH_ALL = client -> {doQuery(client, (request, sourceBuilder) -> {// 全量查询sourceBuilder.query(QueryBuilders.matchAllQuery());});
};public static void main(String[] args) {ConnectElasticsearch.connect(SEARCH_ALL); // 全量查询
}

全量查询

示例:查询所有索引数据

public static final ElasticsearchTask SEARCH_ALL = client -> {doQuery(client, (request, sourceBuilder) -> {// 查询全部sourceBuilder.query(QueryBuilders.matchAllQuery());});
};
took:2ms
timeout:false
total:6 hits
MaxScore:1.0
hits========>>
{"name":"zhangsan","age":"10","sex":"女"}
{"name":"lisi","age":"30","sex":"女"}
{"name":"wangwu1","age":"40","sex":"男"}
{"name":"wangwu2","age":"20","sex":"女"}
{"name":"wangwu3","age":"50","sex":"男"}
{"name":"wangwu4","age":"20","sex":"男"}
<<========

条件查询

示例:查询年龄为 30 的索引数据

public static final ElasticsearchTask SEARCH_BY_CONDITION = client -> {doQuery(client, (request, sourceBuilder) -> {// 查询条件:age = 30sourceBuilder.query(QueryBuilders.termQuery("age", "30"));});
};
took:10ms
timeout:false
total:1 hits
MaxScore:1.0
hits========>>
{"name":"lisi","age":"30","sex":"女"}
<<========

分页查询

示例:每页 2 条数据,查询第 1 页的数据

public static final ElasticsearchTask SEARCH_BY_PAGING = client -> {doQuery(client, (request, sourceBuilder) -> {// 当前页起始索引(第一条数据的顺序号) fromsourceBuilder.from(0);// 每页显示多少条 sizesourceBuilder.size(2);});
};
took:2ms
timeout:false
total:6 hits
MaxScore:1.0
hits========>>
{"name":"zhangsan","age":"10","sex":"女"}
{"name":"lisi","age":"30","sex":"女"}
<<========

查询排序

public static final ElasticsearchTask SEARCH_WITH_ORDER = client -> {doQuery(client, (request, sourceBuilder) -> {// 查询全部sourceBuilder.query(QueryBuilders.matchAllQuery());// 年龄升序sourceBuilder.sort("age", SortOrder.ASC);});
};
took:57ms
timeout:false
total:6 hits
MaxScore:NaN
hits========>>
{"name":"zhangsan","age":"10","sex":"女"}
{"name":"wangwu2","age":"20","sex":"女"}
{"name":"wangwu4","age":"20","sex":"男"}
{"name":"lisi","age":"30","sex":"女"}
{"name":"wangwu1","age":"40","sex":"男"}
{"name":"wangwu3","age":"50","sex":"男"}
<<========

组合查询

public static final ElasticsearchTask SEARCH_BY_BOOL_CONDITION = client -> {doQuery(client, (request, sourceBuilder) -> {BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();// 必须包含: age = 30boolQueryBuilder.must(QueryBuilders.matchQuery("age", "30"));// 一定不含:name = zhangsanboolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));// 可能包含: sex = 男boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));sourceBuilder.query(boolQueryBuilder);});
};
took:2ms
timeout:false
total:1 hits
MaxScore:1.0
hits========>>
{"name":"lisi","age":"30","sex":"女"}
<<========

范围查询

public static final ElasticsearchTask SEARCH_BY_RANGE = client -> {doQuery(client, (request, sourceBuilder) -> {RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");// rangeQuery.gte("30"); // age 大于等于 30rangeQuery.lte("40"); // age 小于等于 40sourceBuilder.query(rangeQuery);});
};
took:7ms
timeout:false
total:5 hits
MaxScore:1.0
hits========>>
{"name":"zhangsan","age":"10","sex":"女"}
{"name":"lisi","age":"30","sex":"女"}
{"name":"wangwu1","age":"40","sex":"男"}
{"name":"wangwu2","age":"20","sex":"女"}
{"name":"wangwu4","age":"20","sex":"男"}
<<========

模糊查询

public static final ElasticsearchTask SEARCH_BY_FUZZY_CONDITION = client -> {doQuery(client, (request, sourceBuilder) -> {// 模糊查询: name 包含 wangwu 的数据sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.ONE));});
};
took:5ms
timeout:false
total:4 hits
MaxScore:1.2837042
hits========>>
{"name":"wangwu1","age":"40","sex":"男"}
{"name":"wangwu2","age":"20","sex":"女"}
{"name":"wangwu3","age":"50","sex":"男"}
{"name":"wangwu4","age":"20","sex":"男"}
<<========

高亮查询

public static final ElasticsearchTask SEARCH_WITH_HIGHLIGHT = client -> {SearchRequest request = new SearchRequest().indices("user");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 构建查询方式:高亮查询TermsQueryBuilder termsQueryBuilder =QueryBuilders.termsQuery("name", "zhangsan");// 设置查询方式sourceBuilder.query(termsQueryBuilder);// 构建高亮字段HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.preTags("<font color='red'>"); // 设置标签前缀highlightBuilder.postTags("</font>"); // 设置标签后缀highlightBuilder.field("name"); // 设置高亮字段// 设置高亮构建对象sourceBuilder.highlighter(highlightBuilder);// 设置请求体request.source(sourceBuilder);// 客户端发送请求,获取响应对象SearchResponse response = client.search(request, RequestOptions.DEFAULT);SearchHits hits = response.getHits();for (SearchHit hit : hits) {String sourceAsString = hit.getSourceAsString();System.out.println(sourceAsString);// 打印高亮结果Map<String, HighlightField> highlightFields = hit.getHighlightFields();System.out.println(highlightFields);}
};
{"name":"zhangsan","age":"10","sex":"女"}
{name=[name], fragments[[<font color='red'>zhangsan</font>]]}

最大值查询

public static final ElasticsearchTask SEARCH_WITH_MAX = client -> {SearchRequest request = new SearchRequest().indices("user");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));request.source(sourceBuilder);// 客户端发送请求,获取响应对象SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println(response);
};
{..., // 省略"aggregations": {"max#maxAge": {"value": 50.0}}
}

分组查询

public static final ElasticsearchTask SEARCH_WITH_GROUP = client -> {SearchRequest request = new SearchRequest().indices("user");SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));request.source(sourceBuilder);// 客户端发送请求,获取响应对象SearchResponse response = client.search(request, RequestOptions.DEFAULT);System.out.println(response);
};
{..., // 省略"aggregations": {"lterms#age_groupby": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key": 20,"doc_count": 2}, {"key": 10,"doc_count": 1}, {"key": 30,"doc_count": 1}, {"key": 40,"doc_count": 1}, {"key": 50,"doc_count": 1}]}}
}

【ElasticSearch 学习笔记】Java API相关推荐

  1. ElasticSearch学习笔记之十一 Anayle API和IK分词器

    ElasticSearch学习笔记之十一 Anayle API和IK分词器 Anayle API IK分词器 IK分词器版本支持 安装 下载或者编译 选择一 选择二 重启ElasticSearch I ...

  2. 黑马程序员--分布式搜索ElasticSearch学习笔记

    写在最前 黑马视频地址:https://www.bilibili.com/video/BV1LQ4y127n4/ 想获得最佳的阅读体验,请移步至我的个人博客 SpringCloud学习笔记 消息队列M ...

  3. JDBC学习笔记——Java语言与数据库的鹊桥

    JDBC学习笔记--Java语言与数据库的鹊桥     JDBC(Java DataBase Connectivity):SUN公司提供的 一套操作数据库的标准规范,说白了就是用Java语言来操作数据 ...

  4. ElasticSearch 学习笔记:Multi Search

    本文目录 1 简介 2 格式 3 header格式 4 body格式 5 返回格式 6 性能 7 相关文章 1 简介 批量查询接口(Multi Search API)允许在一次请求中执行多个查询操作, ...

  5. ElasticSearch学习笔记(8)· ES集群的搭建

    目录 十三.集群的实现 1.相关概念 集群(cluster) 节点(node) 分配和复制(shards & replicas) 2.快速搭建集群 3.安装head插件 十三.集群的实现 1. ...

  6. elasticSearch学习笔记04-同义词,停用词,拼音,高亮,拼写纠错

    由于elasticSearch版本更新频繁,此笔记适用ES版本为 7.10.2 此笔记摘录自<Elasticsearch搜索引擎构建入门与实战>第一版 文中涉及代码适用于kibana开发工 ...

  7. 学习笔记-Java并发(一)

    学习笔记-Java并发(一) 目录 学习笔记-Java并发一 目录 Executer Callable和Future 后台线程 线程加入 小计 今天看了这一篇 Java编程思想-java中的并发(一) ...

  8. ElasticSearch学习笔记-ngram、中文拼音、简繁体搜索记录

    ElasticSearch版本:elasticsearch-7.3.0 ElasticSearch相关插件安装可以参考: ElasticSearch学习笔记-插件安装记录_人生偌只如初见的博客-CSD ...

  9. ElasticSearch学习笔记之二十一 指标聚合

    ElasticSearch学习笔记之二十一 指标聚合 指标聚合 Avg Aggregation Script Value Script Missing value Weighted Avg Aggre ...

  10. ElasticSearch入门-搜索(java api)

    ElasticSearch入门-搜索(java api) package com.qlyd.searchhelper;import java.util.Map;import net.sf.json.J ...

最新文章

  1. 【Mac visual studio community使用技巧】打开vs如何查看解决方案等
  2. android 自定义键盘_Android自定义输入车牌号键盘、车牌简称,数字 ,字母键盘...
  3. C#操作NPOI插件的HSSFWorkBook,常见的那些坑
  4. java同步通信方式_java多线程同步与通信示例(synchronized方式)
  5. 女垒姑娘最漂亮,青年女足最顽强
  6. python编写正则表达式匹配单词_Python正则表达式匹配整个单词
  7. mysql 转义字符6_MySQL的转义字符
  8. iOS 核心动画 Core Animation浅谈
  9. poj 3714 Raid
  10. 3S基础知识:MapInfo MapX中如何保存专题地图
  11. Linux 无线无法获取ip,Linux无法获取IP地址
  12. 20 犹豫:灰度认知,黑白决策
  13. 3dmax 视频全集
  14. 《Spring Boot极简教程》附录1 计算机简史
  15. H5页面打开微信小程序
  16. c语言操作符的自我总结hhhhhhhhh
  17. 断章取义:关于红玫瑰和白玫瑰
  18. 抖音书单号如何快速上热门
  19. sigprocmask , sigpending 和 sigsuspend函数
  20. python gui是什么_python的gui是什么

热门文章

  1. “一加一减”的两种说话技巧
  2. 今日花生价格多少钱一斤?
  3. 职场中晋升最快的人具有什么特点?
  4. 投简历没回音?你没写到点子上,HR当然不看
  5. 一切想要发财的人,你都要善于看到隐形的东西
  6. 读书和不读书有什么区别呢?
  7. iOS系统什么天气app可以访问锁屏?
  8. 如果华为自研的芯片无法给华为手机带来更高的性价比,那么华为自研芯片给消费者带来的意义是什么呢?
  9. 火狐浏览器使用copper插件无反应问题
  10. android新对象锁,Android的线程和对象锁定