目录

一、操作索引库(用不到)

1.判断索引库是否存在

2.删除索引库

3.创建索引库

4.小结

二、操作文档(重点)

1.新增文档(数据库新增数据的时候  同步es索引库)

2.查询文档

3.修改文档

4.删除文档

5.批量操作(用于把所有数据的数据同步到ES索引库,先查询出所有然后一条条添加)

6.小结

三、查询文档

1.查询所有

2.全文检索

3.精确查询

①词条查询

②范围查询

4.地理查询

①矩形范围

②圆形范围

5.算分函数 (增加分值,让分值大于别人,排名时会在最前面)

6.复合查询(用于有多个查询条件的时候)

7.排序、分页

8.高亮(几乎所有搜索项目都要加)

四、项目实例,建议直接跳转


零、实现搜索业务,肯定离不开RestHighLevelClient,我们需要把它注册到Spring中作为一个Bean。

@Bean
public RestHighLevelClient client(){return new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.136.134:9200")));
}

一、操作索引库(用不到)

1.判断索引库是否存在

@Test
void testExistsHotelIndex() throws IOException {// 1.创建Request对象GetIndexRequest request = new GetIndexRequest("hotel");// 2.发送请求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}

2.删除索引库

@Test
void testDeleteHotelIndex() throws IOException {// 1.创建Request对象DeleteIndexRequest request = new DeleteIndexRequest("hotel");// 2.发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}

3.创建索引库

@Test
void createHotelIndex() throws IOException {// 1.创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2.准备请求的参数:DSL语句request.source(HotelConstants.MAPPING_TEMPLATE, XContentType.JSON);// 3.发送请求client.indices().create(request, RequestOptions.DEFAULT);
}

4.小结

索引库操作的基本步骤:- 初始化`RestHighLevelClient`
- 创建`XxxIndexRequest`。XXX是Get、Create、Delete
- 准备参数(Create需要)
- 发送请求。调用`RestHighLevelClient.indices().xxx()`方法,xxx是exists、create、delete

二、操作文档(重点)

1.新增文档(数据库新增数据的时候  同步es索引库)

    //添加文档@Testpublic void testAddDocument() throws Exception {//1 准备文档数据// 1-1 根据id查询酒店数据Hotel hotel = hotelMapper.selectById(61083L);// 1-2 转为文档实体类型HotelDoc hotelDoc = new HotelDoc(hotel);// 1-3 将hotelDoc转为jsonString json = JSON.toJSONString(hotelDoc);//2 创建requestIndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());request.source(json, XContentType.JSON);//3 发送请求client.index(request, RequestOptions.DEFAULT);}

2.查询文档

    //根据id查询文档@Testpublic void testGetDocumentById()throws Exception{// 1.创建requestGetRequest request = new GetRequest("hotel", "61083");// 2.发送请求,得到响应GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析响应String json = response.getSourceAsString();// 4.json转为hotelDocHotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc);}

3.修改文档

    //根据id修改指定文档@Testpublic void testUpdateDocument() throws Exception {// 1.创建requestUpdateRequest request = new UpdateRequest("hotel", "61083");//2. 设置更新内容Map<String, Object> map = new HashMap<>();map.put("price", 339);map.put("starName", "四钻");request.doc(map);// 3.发送请求client.update(request, RequestOptions.DEFAULT);}

4.删除文档

    //删除文档@Testvoid testDeleteDocument() throws IOException {// 1.创建RequestDeleteRequest request = new DeleteRequest("hotel", "61083");// 2.发送请求client.delete(request, RequestOptions.DEFAULT);}

5.批量操作(用于把所有数据的数据同步到ES索引库,先查询出所有然后一条条添加)

 //批量操作@Testpublic void testBulkRequest() throws Exception {// 查询所有酒店数据List<Hotel> hotelList = hotelMapper.selectList(null);// 1.创建requestBulkRequest request = new BulkRequest();// 2.准备DSLfor (Hotel hotel : hotelList) {// 2-1 转为文档类型HotelDoc hotelDoc = new HotelDoc(hotel);// 2-2 转为jsonString json = JSON.toJSONString(hotelDoc);// 2-3 新增documentrequest.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(json, XContentType.JSON));}// 3.发送请求client.bulk(request, RequestOptions.DEFAULT);}

6.小结

文档操作的基本步骤:- 初始化`RestHighLevelClient`
- 创建`XxxRequest`。XXX是Index、Get、Update、Delete、Bulk
- 准备参数(Index、Update、Bulk时需要)
- 发送请求。调用`RestHighLevelClient..xxx()`方法,xxx是index、get、update、delete、bulk
- 解析结果(Get时需要)

三、查询文档

1.查询所有

    //查询@Testpublic void testMatchAll() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.matchAllQuery() //match_all);//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);//hits.total.valueSearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();//hits.hits.get(n).sourceSystem.out.println(JSON.parseObject(source, HotelDoc.class));}}elasticsearch返回的结果是一个JSON字符串,结构包含:- `hits`:命中的结果- `total`:总条数,其中的value是具体的总条数值- `max_score`:所有结果中得分最高的文档的相关性算分- `hits`:搜索结果的文档数组,其中的每个文档都是一个json对象- `_source`:文档中的原始数据,也是json对象因此,我们解析响应结果,就是逐层解析JSON字符串,流程如下:- `SearchHits`:通过response.getHits()获取,就是JSON中的最外层的hits,代表命中的结果- `SearchHits.getTotalHits().value`:获取总条数信息- `SearchHits.getHits()`:获取SearchHit数组,也就是文档数组- `SearchHit.getSourceAsString()`:获取文档结果中的_source,也就是原始的json文档数据

2.全文检索

    //查询 match@Testpublic void testMatch() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.matchQuery("all", "外滩如家") //match);//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}//查询 multi_match@Testpublic void testMultiMatch() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.multiMatchQuery("外滩如家", "brand", "business", "name"));//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

3.精确查询

①词条查询

    //词条查询 term@Testpublic void testTerm() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.termQuery("city", "北京"));//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

②范围查询

//范围查询 range
@Test
public void testRange() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 构建条件,并添加到查询请求request.source().query(rangeQuery("price").gte(1000).lte(2000));//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}
}

4.地理查询

矩形范围

   //矩形范围查询 geo_bounding_box@Testpublic void testGeoBoundingBox() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.geoBoundingBoxQuery("location").setCorners(new GeoPoint(40.08, 116.47), new GeoPoint(39.9, 116.405)));//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

②圆形范围

    //矩形圆形查询 geo_distance@Testpublic void testGeoDistance() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.geoDistanceQuery("location").point(39.9, 116.405)//设置圆心坐标.distance("15km")//设置半径);//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

5.算分函数 (增加分值,让分值大于别人,排名时会在最前面)

    //算分函数@Testpublic void testFunctionScore() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.functionScoreQuery(QueryBuilders.matchQuery("all", "北京"),//设置查询条件new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{ //设置算分函数new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("brand", "凯悦"),ScoreFunctionBuilders.weightFactorFunction(10))}).boostMode(CombineFunction.MULTIPLY) //设置算法策略);//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

6.复合查询(用于有多个查询条件的时候)

    //布尔查询@Testpublic void testBoolean() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("name", "如家")).mustNot(QueryBuilders.rangeQuery("price").gte(400)).filter(QueryBuilders.geoDistanceQuery("location").point(39.9, 116.405)//设置圆心坐标.distance("10km")//设置半径));//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

7.排序、分页

     // 排序 分页@Testpublic void testPageAndSort() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.matchAllQuery());request.source().sort("price", SortOrder.ASC);//排序,按照价格正序排request.source().from(0).size(10);//分页,从0查,查10个;//3. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析结果System.out.println("结果数量:" + response.getHits().getTotalHits().value);SearchHit[] searchHitArr = response.getHits().getHits();for (SearchHit searchHit : searchHitArr) {String source = searchHit.getSourceAsString();System.out.println(JSON.parseObject(source, HotelDoc.class));}}

8.高亮(几乎所有搜索项目都要加)

    //高亮@Testpublic void testHighLight() throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件request.source().query(QueryBuilders.matchQuery("all", "如家"));//3. 设置高亮效果request.source().highlighter(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>").requireFieldMatch(false));//4. 执行请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//5. 解析结果SearchHit[] searchHits = response.getHits().getHits();for (SearchHit searchHit : searchHits) {//没有效果的对象HotelDoc hotelDoc = JSON.parseObject(searchHit.getSourceAsString(), HotelDoc.class);//解析效果,替换上面对象中的title的值String name = (searchHit.getHighlightFields().get("name").getFragments())[0].toString();hotelDoc.setName(name);System.out.println(hotelDoc);}}

四、项目实例,建议直接跳转

    @Overridepublic PageResult list(RequestParams requestParams) throws IOException {//1. 构建查询请求SearchRequest request = new SearchRequest("hotel");//2. 设置查询条件//2-1创建复合查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//2-2 获取搜索关键字, 设置为查询条件String key = requestParams.getKey();if (StringUtils.isEmpty(key)) {boolQuery.must(QueryBuilders.matchAllQuery());} else {boolQuery.must(QueryBuilders.matchQuery("all", key));}//2-3 获取城市、星级、品牌、价格,使用过滤语法筛选// 城市if (StrUtil.isNotEmpty(requestParams.getCity())) {boolQuery.filter(QueryBuilders.termQuery("city", requestParams.getCity()));}// 星级if (StrUtil.isNotEmpty(requestParams.getStarName())) {boolQuery.filter(QueryBuilders.termQuery("starName", requestParams.getStarName()));}// 品牌if (StrUtil.isNotEmpty(requestParams.getBrand())) {boolQuery.filter(QueryBuilders.termQuery("brand", requestParams.getBrand()));}// 价格if (requestParams.getMinPrice() != null && requestParams.getMaxPrice() != null) {boolQuery.filter(QueryBuilders.rangeQuery("price").gte(requestParams.getMinPrice()).lte(requestParams.getMaxPrice()));}//2-4 使用算分函数 提供广告酒店的排名FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD", true),ScoreFunctionBuilders.weightFactorFunction(5))});request.source().query(functionScoreQuery);//3. 设置分页Integer pageNum = requestParams.getPage();Integer pageSize = requestParams.getSize();request.source().from((pageNum - 1) * pageSize).size(pageSize);//4. 设置排序String location = requestParams.getLocation();if (StrUtil.isNotEmpty(location)) {request.source().sort(SortBuilders.geoDistanceSort("location", new GeoPoint(location))//设置核心坐标位置.order(SortOrder.ASC) //设置排序方式.unit(DistanceUnit.KILOMETERS)// 单位);}//5. 设置高亮request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));//6. 发起请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//7. 处理结果return handleResponse(response);}

五、没用

# 测试默认分词器
GET /_analyze
{"analyzer": "standard","text": "程序员学习java太棒了"
}# 测试IK分词器
GET /_analyze
{"analyzer": "ik_smart","text": "程序员学习java太棒了"
}GET /_analyze
{"analyzer": "ik_max_word","text": "程序员学习java太棒了"
}GET /_analyze
{"analyzer": "ik_max_word","text": "程序员的Java就业超过90%,奥力给了!"
}# 创建索引库
PUT /course# 查看索引库
GET /course# 删除索引库
DELETE /course# 创建索引库
PUT /course
# 自定义映射
PUT /course/_mapping/
{"properties":{"title":{"type":"text","analyzer":"ik_max_word"},"images":{"type":"keyword","index":false},"price":{"type":"float"},"name":{"properties":{"firstName":{"type":"keyword"},"lastName":{"type":"keyword"}}}}
}
# 查看映射
GET /course/_mapping# 创建索引库的时候同时设置映射
PUT /course/
{"mappings": {"properties":{"title":{"type":"text","analyzer":"ik_max_word"},"images":{"type":"keyword","index":false},"price":{"type":"float"},"name":{"properties":{"firstName":{"type":"keyword"},"lastName":{"type":"keyword"}}}}}
}# 创建文档
POST /course/_doc/1
{"title":"小米手机","price":2000,"images":"http://image.xiaomi.com/1.jpg","name":{"firstName":"三","lastName":"张"}
}# 创建文档
POST /course/_doc
{"title":"华为手机","price":3000,"images":"http://image.huawei.com/1.jpg","name":{"firstName":"四","lastName":"李"}
}# 根据主键查询
GET /course/_doc/1
GET /course/_doc/Wn37GoMBJhQmYmwV_1pK# 全量修改,语法跟新增一致
POST /course/_doc/1
{"title":"小米手机","price":2500,"images":"http://image.xiaomi.com/1.jpg","name":{"firstName":"三","lastName":"张"}
}# 增量修改
POST /course/_update/1
{"doc": {"title":"大米手机","price":2500}
}# 删除
DELETE /course/_doc/1# 查询所有
GET /hotel/_search
{"query": {"match_all": {}}
}# 全文检索(分词) 针对于一个字段
GET /hotel/_search
{"query": {"match": {"all": "外滩如家"}}
}# 全文检索(分词) 针对于多个字段
GET /hotel/_search
{"query": {"multi_match": {"query": "外滩如家","fields": ["name","brand","business"]}}
}# 精确查询(term)
GET /hotel/_search
{"query": {"term": {"city": {"value": "北京"}}}
}# 精确查询(range)
GET /hotel/_search
{"query": {"range": {"price": {"gte": 1000,"lte": 2000}}}
}# 矩形范围
GET /hotel/_search
{"query": {"geo_bounding_box":{"location": {"top_left": {"lat": 40.08,"lon": 116.47},"bottom_right": {"lat": 39.9,"lon": 116.405}}}}
}# 圆形范围
GET /hotel/_search
{"query": {"geo_distance":{"distance":"15km","location":"39.9,116.405"}}
}# 默认查询
GET /hotel/_search
{"query": {"match": {"all": "北京"}}
}# 算分函数查询
GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"all": "北京"}},"functions": [{"filter": {"term": {"brand": "凯悦"}},"weight": 20}],"boost_mode": "multiply"}}
}# 复合查询
# 需求:搜索名字包含“如家”,价格不高于400,在坐标39.9,116.405周围10km范围内的酒店
GET /hotel/_search
{"query": {"bool": {"must": [{"term": {"name": {"value": "如家"}}}],"must_not": [{"range": {"price": {"gt": 400}}}],"filter": [{"geo_distance": {"distance": "10km","location": {"lat": 39.9,"lon": 116.405}}}]}}
}# 按照价格正序排列
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "asc"}},{"score": "desc"}]
}# 按照距离远近排列(需要指定的是参考点)
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 39.91512,"lon": 116.40396},"order": "asc"}}]
}# 分页
GET /hotel/_search
{"query": {"match_all": {}},"from": 9990,"size": 11
}# 高亮
GET /hotel/_search
{"query": {"match": {"name": "如家"}},"highlight": {"fields": {"name":{"pre_tags":"<em>","post_tags":"</em>"}}}
}
GET /hotel/_search
{"query": {"match": {"all": "如家"}},"highlight": {"fields": {"name":{"pre_tags":"<i>","post_tags":"</i>","require_field_match": "false"}}}
}#聚合为桶
GET /hotel/_search
{"query":{ //搜索条件"range": {"price":{"lte": 500} }}, "size": 0, //不查询具体的数据  "aggs": { //声明这是一个聚合查询,是aggregations的缩写"brandAgg": { //给这次聚合起一个名字,可任意指定"terms": { //聚合的类型,这里选择terms,是根据词条内容(这里是品牌)划分"field": "brand", //按照哪个字段分组"size": 10, //显示多少条聚合结果  "order": {"_count": "asc" //分组之后可以根据数量排序}}}}
}#桶内度量
GET /hotel/_search
{"query":{"match_all": {}}, "size": 0, //不查询具体的数据    "aggs": {"brandAgg": {"terms": {"field": "brand", //按照哪个字段分组"order": {"scoreAgg.avg": "desc" //根据指定的统计项排序}},"aggs":{  //是brands聚合的子聚合,也就是分组后对每组分别计算"scoreAgg": {//聚合名称"stats": {//聚合类型,这里stats可以计算min、max、avg等"field":"score"//聚合字段,这里是score}}}}}
}# 设置分词器
PUT /test
{"settings": {"analysis": {"analyzer": { "my_analyzer": { "tokenizer": "ik_max_word","filter": "py"}},"filter": {"py": { "type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {"properties": {"name":{"type": "text","analyzer": "my_analyzer","search_analyzer": "ik_smart"}}}
}# 创建模拟数据
POST /test/_doc/1
{"id": 1,"name": "狮子"
}
POST /test/_doc/2
{"id": 2,"name": "虱子"
}# 重新查询
GET /test/_search
{"query": {"match": {"name": "shizi"}}
}GET /test/_search
{"query": {"match": {"name": "狮子"}}
}

ElasticSearch(项目中常用的ES)相关推荐

  1. 基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率

    基于springboot项目中使用docker-compose+es+kibana+logstash+mysql 提高数据查询效率 1.拉取logstash,kibana,es,mysql镜像 #命令 ...

  2. VB的一些项目中常用的通用方法-一般用于验证类

    1.VB的一些项目中常用的通用方法: ' 设置校验键盘输入值,数字 Public Function kyd(key As Integer) As Integer '20060728 Dim mycha ...

  3. Android 项目中常用到的第三方组件

    项目中常用到的第三方组件 1 社会化分享 ShareSDK-Core-2.5.9.jar ShareSDK-QQ-2.5.9.jar ShareSDK-QZone-2.5.9.jar ShareSDK ...

  4. C#项目中常用到的设计模式

    C#项目中常用到的设计模式 1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代 ...

  5. 关于mysql的项目_项目中常用的MySQL 优化

    本文我们来谈谈项目中常用的MySQL优化方法,共19条,具体如下: 一.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我 ...

  6. 乐鑫esp8266学习rtos3.0笔记第9篇:整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  7. 项目中常用的MySQL优化你知道多少?

    项目中常用的MySQL优化 文章目录 项目中常用的MySQL优化 前言 一.mysql优化是什么? 二.优化步骤 1.EXPLAIN 2.SQL语句中IN包含的值不应太多 3.SELECT语句务必指明 ...

  8. Android项目中常用的工具类集(史上最全整理)

    如果你是一名有经验的Android开发者,那么你一定积累了不少的工具类,这些工具类是帮助我们快速开发的基础.如果你是新手,那么有了这些辅助类,可以让你的项目做起来更加的简单. 下面介绍一个在GitHu ...

  9. 面试官:项目中常用的 .env 文件原理是什么?如何实现?

    1. 前言 大家好,我是若川.持续组织了5个月源码共读活动,感兴趣的可以点此加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.同时极力推荐订阅我写的<学习源码整 ...

最新文章

  1. lisp不是函授型语言_【神奇的函数式编程语言的独特功能】Lisp 的运行期修改、编译代码,并替换当前运行版本的试验...
  2. 快手小店电脑版_微信PC版更新!支持在小程序中使用微信支付 | 一周资讯
  3. Linux上的TIME_WAIT和tcp_fin_timeout
  4. Tomcat forward debug - how is jsp file served in Tomcat
  5. 数据仓库、商业智能的体系结构
  6. Android之版本检测和更新
  7. c语言中栈堆,C语言中堆和栈的区别
  8. BIOS详情设置续一
  9. 阿里云总裁张建锋:新型计算体系结构正在形成
  10. python的zip()函数
  11. Zabbix4.2安装和4.0升级4.2笔记
  12. Java和jsp编程中应该注意的几个常见问题
  13. vs2010 快捷键大全
  14. Win10不能禁和不建议禁的服务以及禁用后的影响
  15. macos下安装john the ripper并配置zip2john
  16. 群同态和群同构的区别_同构和同态有什么区别,它们可以用在哪些方面?
  17. 日消息量突破 50 亿,谈小米的高可用推送系统设计
  18. 3评选最牛群主v1.0(4分)
  19. 【Python爬虫学习】七、淘宝商品价格爬取(成功爬取)
  20. iframe边框使用详解

热门文章

  1. 微信小程序商城 (后台JAVA)
  2. Matplotlib学习手册A005_Figure的add_axes()方法
  3. 机器自动翻译古文拼音 - 十大宋词 - 念奴娇 赤壁怀古 苏轼
  4. unity3d/用户自由改变背景色
  5. [软件分享]Bandizip(有史以来最好的压缩软件)「v1.0」
  6. Apache IoTDB 鼠年总结
  7. Oracle-索引、视图
  8. 绿色出行之路 中国越走越宽
  9. 如何设计一个风控实验?以度小满风控实验平台架构设计为例
  10. NTP客户端配置-Windows时间同步设置