Elasticsearch(二)

news2024/11/26 22:52:39

Clasticsearch(二)

DSL查询语法

文档

文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

常见查询类型包括:

  • 查询所有:查询出所有数据,一般测试用。如:match_all

  • 全文检索查询:利用分词器对用户输入的内容分词,然后去倒排索引库中匹配。如

    • match_query
    • multi_match_query
  • 精确查询:根据精确词条查找数据,一般是查找keyword、数值、日期、boolean等字符。如:

    • ids
    • range
    • term
  • 地理查询:根据经纬度查询。例如:

    • geo_distance
    • geo_bounding_box
  • 复合查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。如

    • bool
    • function_score

基本语法

查询DSL基本语法

GET /indexName/_search
{
	"query":{
  	"查询类型":{
    	"查询条件":"条件值"
    }
  }
}

全文检索查询

GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

精确查询

常用:

  • term查询
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}
  • range查询
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 100,
        "lte": 300
      }
    }
  }
}

地理查询

常见场景包括:

  • 携程:搜索我附近的酒店
  • 滴滴:搜索我附近的出租车
  • 微信:搜索我附近的人

根据经纬度查询:

  • geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档

img

  • geo_distance:查询到指定中心小于某个距离值得所有文档

img

复合查询

复合查询:复合查询可以将其它简单查询组合起来,实现复杂得搜索逻辑,例如:

  • function score:算分函数查询,可以控制文档相关性算分,控制文档排名

相关性算分

img

Function Score Query

img

案例:给“如家”这个品牌得酒店排名靠前一些

img

Boolean Query

布尔查询是一个或多个子句得组合。子查询得组合方式有:

  • must:必须匹配每个子查询,类似“与”
  • should:选择性匹配子查询,类似“或”
  • must_not:必须不匹配,不参与算分,类似“非”
  • filter:必须匹配,不参与算分

案例:利用bool查询实现功能

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "如家"
          }
        }
      ],
      "must_not": [
        {
          "range": {
            "price": {
              "gt": 400
            }
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 31.21,
              "lon": 121.5
            }
          }
        }
      ]
    }
  }
}

搜索结果处理

排序

elasticsearch支持搜索结果排序,默认是根据相关度算分来排序。可以排序类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

img

分页

elasticsearch默认情况下只返回top10得数据。如果要查询更多数据就需要修改分页参数。

elasticsearch中通过修改from、size参数来控制要返回得分页结果:

img

深度分页问题

ES是分布式的,所以会面临深度分页问题。

img

深度分页解决方案

针对深度分页,ES提供了两种解决方案:

  • search after:分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。
  • scroll:原理将排序数据形成快照,保存在内存。官方已经不推荐使用。

高亮

img

RestClient查询文档

快速入门

img

    @Test
    void testInit() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }

解析JSON

img

    @Test
    void testInit() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析响应
        SearchHits hits = response.getHits();
        // 4.1.获取总条数
        long total = hits.getTotalHits().value;
        System.out.println(total);
        // 4.2.遍历文档数组
        for (SearchHit hit : hits.getHits()) {
            // 4.3.获取json对象
            String json = hit.getSourceAsString();
            // 4.4.将json对象变成java对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

全文检索查询

img

精确查询

img

复合查询-boolean query

    @Test
    void testBool() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.termQuery("city","上海"));
        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
        request.source().query(boolQuery);
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        handleResponse(response);
    }

	/**
     * 解析响应
     * @param response
     */
    private static void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits hits = response.getHits();
        // 4.1.获取总条数
        long total = hits.getTotalHits().value;
        System.out.println(total);
        // 4.2.遍历文档数组
        for (SearchHit hit : hits.getHits()) {
            // 4.3.获取json对象
            String json = hit.getSourceAsString();
            // 4.4.将json对象变成java对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
        }
    }

排序和分页

img

    @Test
    void testPageAndSort() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        // 排序
        request.source().sort("price", SortOrder.ASC);
        request.source().from(1).size(5);
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        handleResponse(response);
    }

高亮

img

    @Test
    void testHighlight() throws IOException {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        // 3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        handleResponse(response);
    }

高亮的结果解析

img

/**
     * 解析响应
     * @param response
     */
    private static void handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits hits = response.getHits();
        // 4.1.获取总条数
        long total = hits.getTotalHits().value;
        System.out.println(total);
        // 4.2.遍历文档数组
        for (SearchHit hit : hits.getHits()) {
            // 4.3.获取json对象
            String json = hit.getSourceAsString();
            // 4.4.将json对象变成java对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            // 获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)) {
                // 根据字段名获取高亮结果
                HighlightField highlightField = highlightFields.get("name");
                if (highlightField != null) {
                    // 获取高亮值
                    String name = highlightField.getFragments()[0].string();
                    hotelDoc.setName(name);
                }
            }
            System.out.println(hotelDoc);
        }
    }

demo案例

实现搜索功能

1.定义实体类,接受前端请求

RequestParams

@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
}

PageResult

@Data
public class PageResult {
    private Long total;
    
    private List<HotelDoc> hotels;
}

2.定义controller接口,接受页面请求,调用IHotelService的search方法

    @PostMapping("/list")
    public PageResult search(@RequestBody RequestParams params) {
        return hotelService.search(params);
    }

3.定义IHotelService中的search方法,利用match查询实现根据关键字搜索酒店信息

 @Override
    public PageResult search(RequestParams params) {
        try {
            // 1.准备Request
            SearchRequest request = new SearchRequest("hotel");
            // 2.准备DSL
            String key = params.getKey();
            if (StringUtils.isBlank(key)) {
                request.source().query(QueryBuilders.matchAllQuery());
            } else {
                request.source().query(QueryBuilders.matchQuery("all", key));
            }
            // 分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);
            // 3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 解析响应
     *
     * @param response
     */
    private static PageResult handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits hits = response.getHits();
        // 4.1.获取总条数
        long total = hits.getTotalHits().value;
        // 4.2.遍历文档数组
        List<HotelDoc> hotels = new ArrayList<>();
        for (SearchHit hit : hits.getHits()) {
            // 4.3.获取json对象
            String json = hit.getSourceAsString();
            // 4.4.将json对象变成java对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            hotels.add(hotelDoc);
        }
        PageResult pageResult = new PageResult();
        pageResult.setTotal(total);
        pageResult.setHotels(hotels);
        return pageResult;
    }

添加品牌、城市、星级、价格等过滤功能

1.修改RequestParams类,添加brand、city、starName、minPrice、maxPrice等参数

package cn.itcast.hotel.pojo;

import lombok.Data;

/**
 * @author xc
 * @date 2023/5/11 16:14
 */
@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;

    private String city;

    private String brand;

    private String starName;

    private Integer minPrice;

    private Integer maxPrice;
}

2.修改search方法的实现,在关键字搜索时,如果brand等参数存在,对其做过滤

@Override
    public PageResult search(RequestParams params) {
        try {
            // 1.准备Request
            SearchRequest request = new SearchRequest("hotel");
            // 2.准备DSL
            // 构建BooleanQuery
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            // 关键字搜索
            String key = params.getKey();
            if (StringUtils.isBlank(key)) {
                boolQuery.must(QueryBuilders.matchAllQuery());
            } else {
                boolQuery.must(QueryBuilders.matchQuery("all", key));
            }
            // 城市条件
            if (params.getCity() != null && !params.getCity().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("city",params.getCity()));
            }
            // 品牌条件
            if (params.getBrand() != null && !params.getBrand().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("brand",params.getBrand()));
            }
            // 星级条件
            if (params.getStarName() != null && !params.getStarName().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("starName",params.getStarName()));
            }
            // 价格条件
            if (params.getMinPrice() != null && params.getMaxPrice() != null) {
                boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
            }
            request.source().query(boolQuery);

            // 分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);
            // 3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

附近的酒店

距离排序

img

    @Override
    public PageResult search(RequestParams params) {
        try {
            // 1.准备Request
            SearchRequest request = new SearchRequest("hotel");
            // 2.准备DSL
            // 构建BooleanQuery
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            // 关键字搜索
            String key = params.getKey();
            if (StringUtils.isBlank(key)) {
                boolQuery.must(QueryBuilders.matchAllQuery());
            } else {
                boolQuery.must(QueryBuilders.matchQuery("all", key));
            }
            // 城市条件
            if (params.getCity() != null && !params.getCity().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("city",params.getCity()));
            }
            // 品牌条件
            if (params.getBrand() != null && !params.getBrand().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("brand",params.getBrand()));
            }
            // 星级条件
            if (params.getStarName() != null && !params.getStarName().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("starName",params.getStarName()));
            }
            // 价格条件
            if (params.getMinPrice() != null && params.getMaxPrice() != null) {
                boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
            }
            request.source().query(boolQuery);

            // 分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);

            // 2.3.排序
            String location = params.getLocation();
            if (location != null && !location.equals("")){
                request.source().sort(SortBuilders
                        .geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS)
                );
            }


            // 3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 解析响应
     *
     * @param response
     */
    private static PageResult handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits hits = response.getHits();
        // 4.1.获取总条数
        long total = hits.getTotalHits().value;
        // 4.2.遍历文档数组
        List<HotelDoc> hotels = new ArrayList<>();
        for (SearchHit hit : hits.getHits()) {
            // 4.3.获取json对象
            String json = hit.getSourceAsString();
            // 4.4.将json对象变成java对象
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            // 获取排序值
            Object[] sortValues = hit.getSortValues();
            if (sortValues.length > 0) {
                Object sortValue = sortValues[0];
                hotelDoc.setDistance(sortValue);
            }
            hotels.add(hotelDoc);
        }
        PageResult pageResult = new PageResult();
        pageResult.setTotal(total);
        pageResult.setHotels(hotels);
        return pageResult;
    }

广告置顶

1.给HotelDoc类添加isAD字段,Boolean类型

package cn.itcast.hotel.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;

    private Object distance;
    
    private Boolean isAD;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

2.修改search方法,添加function score功能,给isAD值为true的酒店增加权重
img

    @Override
    public PageResult search(RequestParams params) {
        try {
            // 1.准备Request
            SearchRequest request = new SearchRequest("hotel");
            // 2.准备DSL
            // 构建BooleanQuery
            BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
            // 关键字搜索
            String key = params.getKey();
            if (StringUtils.isBlank(key)) {
                boolQuery.must(QueryBuilders.matchAllQuery());
            } else {
                boolQuery.must(QueryBuilders.matchQuery("all", key));
            }
            // 城市条件
            if (params.getCity() != null && !params.getCity().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("city",params.getCity()));
            }
            // 品牌条件
            if (params.getBrand() != null && !params.getBrand().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("brand",params.getBrand()));
            }
            // 星级条件
            if (params.getStarName() != null && !params.getStarName().equals("")) {
                boolQuery.filter(QueryBuilders.termQuery("starName",params.getStarName()));
            }
            // 价格条件
            if (params.getMinPrice() != null && params.getMaxPrice() != null) {
                boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));
            }
            // 2.算分
            FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders
                    .functionScoreQuery(boolQuery, new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                            new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                    QueryBuilders.termQuery("isAD",true),
                                    ScoreFunctionBuilders.weightFactorFunction(10)
                            )
                    });

            request.source().query(functionScoreQueryBuilder);

            // 分页
            int page = params.getPage();
            int size = params.getSize();
            request.source().from((page - 1) * size).size(size);

            // 2.3.排序
            String location = params.getLocation();
            if (location != null && !location.equals("")){
                request.source().sort(SortBuilders
                        .geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS)
                );
            }
            // 3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
        int size = params.getSize();
            request.source().from((page - 1) * size).size(size);

            // 2.3.排序
            String location = params.getLocation();
            if (location != null && !location.equals("")){
                request.source().sort(SortBuilders
                        .geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS)
                );
            }
            // 3.发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eNSP模拟器下VRRP+MSTP实验配置

①&#xff1a;底层配置&#xff1a; vlan trunk 略 ②&#xff1a;MSTP配置&#xff1a; 所有交换机&#xff1a; stp region-configuration region-name aa revision-level 1 instance 1 vlan 2 to 3 instance 2 vlan 4 to 5 active region-configuration 核心1&…

Java笔记_21(网络编程)

Java笔记_21 一、网路编程1.1、初始网络编程1.2、网络编程三要素1.3、IP1.4、端口号1.5、协议1.6、UDP协议 一、网路编程 1.1、初始网络编程 什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景:即时通信、网游对战…

(一)SAS初识

1、SAS常用工作窗口 “结果”&#xff08;Result&#xff09;窗口——管理SAS程序的输出结果&#xff1b; “日志”&#xff08;Log&#xff09;窗口——记录程序的运行情况&#xff1b; “SAS资源管理器”&#xff08;Explore&#xff09;窗口&#xff1b; “输出”&#xff0…

洛谷P1217-回文质数 Prime Palindromes

洛谷P1217-回文质数 Prime Palindromes 这个题目我做出来了但是超时了&#xff0c;时间复杂度有点高&#xff0c;主要是因为我用了大量的循环&#xff0c; 所以我这个是比较暴力的解法&#xff0c;下面我分析我的暴力代码 首先是判断回文数的函数 第一步将标识传入参数是不是…

[数据集][目标检测]篮球数据集VOC格式7398张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;7398 标注数量(xml文件个数)&#xff1a;7398 标注类别数&#xff1a;1 标注类别名称:["basketball"]…

详解MNIST数据集下载、解析及显示的Python实现

Content MNIST数据集基本介绍下载MNIST数据集到本地解析MNIST数据集显示MNIST数据集中训练集的前9张图片和标签 随着图像处理、计算机视觉、机器学习&#xff0c;甚至深度学习的蓬勃发展&#xff0c;一个良好的数据集作为学习和测试相关算法非常重要。MNIST数据集对于想要学习和…

PMP 高项 07-项目质量管理

项目质量管理 概念 质量的基本概念 克劳斯比&#xff1a;符合要求 戴明&#xff1a;低成本条件下可预测的一致性和可靠度&#xff0c;适应市场需要 朱兰&#xff1a;适用性&#xff0c;满足客户需要 国际标准化组织&#xff1a;质量是反映实体&#xff08;产品、过程或活动等…

中间件容器化部署实现方案的前期调研

中间件容器化部署是为了实现GitOps模式的持续交付,实现部署即代码。痛点在于大多数中间件都是有状态的,本篇介绍如何实现有状态中间件的容器化部署。 常见中间件要实现容器化部署,需要解决以下问题: 对于网关类中间件,作为流量入口,虽然是无状态类型的中间件,但由于需要…

flask实现S3 Web客户端下载文件

import io from minio import Minio from minio.error import S3Error from flask import Flask, jsonify, render_template, request, send_file# 实例化 Flask 应用 app Flask(__name__)# 配置 MinIO 客户端 minio_client Minio("192.168.2.110:58894",access_ke…

Vue CLI 初始化脚手架

3.1. 初始化脚手架 3.1.1. 说明 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;最新的版本是 4.x文档 Vue CLI 3.1.2. 具体步骤 如果下载缓慢请配置npm淘宝镜像npm config set registry http://registry.npm.taobao.org全局安装 vue/cli npm ins…

Python BP算法模板

BP算法模板 神经网络结构 三大基本结构 权重(轴突、树突) 权重的矩阵表示 数值(胞体) 数值处理方式 sigmoid 函数 def __sigmoid(self,x):return 1 / (1 np.exp(-x))sigmoid 的导函数 def __sigmoid_prime(self,x):return x * (1 - x)sigmoid 函数图像 其目的是将数值限制…

Java多线程synchronized Lock volatile,看完这一篇就够了

线程安全问题 一、对线程安全的理解&#xff08;实际上是内存安全&#xff09;二、线程同步的实现方法synchronized实现同步Lock实现同步volatile实现同步JUC的Callable实现同步 三、守护线程四、ThreadLocal原理和使用场景五、Thread类的常用方法&#xff0c;以及线程的状态六…

Linux下使用Mysql 第二天

目录 Mysql数据库API库 编写hello应用链接函数库 MySQL API常用函数 总体印象 初始化 Makefile 管理 连接数据库关闭连接 读取数据 查询表数据 获取结果集 解析结果集 释放结果集 获取列数 获取表头 实例程序 MySQL tools实现 思路分析 程序实现 中文问题 …

MS iCraft Z790ITX WIFI 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板MS iCraft Z790ITX WIFI 处理器Intel Core i5-13400已驱动 内存Asgard DDR5 6400CL32 16GBx2 RGB已驱动 硬盘西数 WDS250G3X0C-00SJG0 ( SN750) …

如何设计API返回码(错误码)?

一、前言 客户端请求 API&#xff0c;通常需要通过返回码来判断 API 返回的结果是否符合预期&#xff0c;以及该如何处理返回的内容等 相信很多同学都吃过返回码定义混乱的亏&#xff0c;有的 API 用返回码是 int 类型&#xff0c;有的是 string 类型&#xff0c;有的用 0 表…

ansible 常用用例

目录 一、说明 二、创建 ansible 环境 三、实验操作 四、install_ansible.sh 脚本内容 一、说明 该文档是日常经常使用的模板&#xff0c;通过该例子让更多的初学者了解ansible 剧本的写法&#xff0c;很多情况&#xff0c;可以按照该模版来套用即可。 读者不需要下载…

6.深入理解Mysql事务隔离级别与锁机制

MySQL性能调优 1. 概述2. 事务及其ACID属性2.1并发事务带来的问题2.2 事务隔离级别 3. 锁详解3.1 锁分类3.1.1 表锁3.1.2 行锁3.1.3 间隙锁(Gap Lock)3.1.4 临键锁(Next-key Locks)3.1.5 行锁分析3.1.6 查看INFORMATION_SCHEMA系统库锁相关数据表3.1.7 死锁3.1.8 锁优化建议 4.…

iOS - postgetAFNetworking

GET和POST HTTP定义了与服务器交互的不同方法&#xff0c;最基本的方法有4种&#xff0c;分别是GET&#xff0c;POST&#xff0c;PUT&#xff0c;DELETE。URL全称是资源描述符&#xff0c;我们可以这样认为&#xff1a;一个URL地址&#xff0c;它用于描述一个网络上的资源&…

OpenGL高级-实例化

知识点 假如你有一个有许多模型的场景&#xff0c;而这些模型的顶点数据都一样&#xff0c;只是进行了不同的世界空间的变换。想象一下&#xff0c;有一个场景中充满了草叶&#xff1a;每根草都是几个三角形组成的。你可能需要绘制很多的草叶&#xff0c;最终一次渲染循环中就肯…

每日一练 | 华为认证真题练习Day45

1、应用数据经过数据链路层处理后一定携带了MAC地址。 A. 对 B. 错 2、某网络工程师在输入命令行时提示如下信息&#xff1a; Error:Unrecognized command found at’^’position. 对于该提示信息说法正确的是&#xff1f; A. 输入命令不完整 B. 没有查找到关键字 C. 输…