ElasticSearch 7.4学习记录(基础概念和基础操作)

news2024/11/24 15:50:17

若你之前从未了解过ES,本文将由浅入深的一步步带你理解ES,简单使用ES。作者本人就是此状态,通过学习和梳理,产出本文,已对ES有个全面的了解和想法,不仅将知识点梳理,也涉及到自己的理解,初次学习踩的坑都汇总如下。

1 了解ElasticSearch

对于第一次接触ES的读者,该章节将直观的带你体验ES的魅力。

1.1 为何使用ES

使用前

           案例:需模糊查询带有 **华为** 的商品信息

使用MySQL的查询功能:select * from 表名 where name like “%华为%”
模糊查询会导致索引失效,就会全表扫描,效率低

           案例:需模糊查询带有 **华为手机** 的商品信息

使用MySQL的查询功能:select * from 表名 where name like “%华为手机%”
只能找到 华为手机 这样的结果
无法找到 华为荣耀手机华为耳机手机这样的结果,意思就是无法将华为+手机分开查询。这也是MySQL查询功能弱的缺点

使用后

输入 ”华为手机
结果展示: 华为荣耀手机华为耳机手机华为手机,且查询效率高

上述案例旨在告诉读者,面对更复杂的业务场景和搜索需求,单纯的SQL查询远远不能满足,MySQL是存储数据的解决方案,ES则是面对海量数据执行搜索的解决方案。

现在简单了解一下ES是怎么做到的上述优点

1.1 倒排索引

  • 在了解倒排索引概念之前,先看看正向索引

                   案例 :查找含有 明 这个字的诗句
    
数据库信息是否匹配
锄禾日当午x
忽如一夜春风来x
窗前明月光

结果:窗前明月光
缺点:得从第每首诗的第一行的第一个字找,这种正向操作的思想会导致查询比较慢

  • 倒排索引

                 案例: 查找含有 是 这个字的诗句
    

内部操作:
ES内部会自动的窗前明月光这个数据进行分词

拆分单词结果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光
窗前明月光
窗前明月光
窗前明月光

找到关键字 明,得到对应的结果,效率很快的。我们习惯性将这种不直接查询的设计叫倒排索引

案例升级
此时需要在数据库中再存储一条数据”明月几时有“,ES会如何操作?
当然是自动拆分这句话

拆分单词结果
窗前窗前明月光
窗前明月光
窗前明月光
明月窗前明月光;明月几时有
窗前明月光;明月几时有
窗前明月光;明月几时有
窗前明月光
几时明月几时有
明月几时有

拆分的单词若已经有了,直接存储在后面就行;若拆分的单词是新的,则续上。

  • 优化倒排索引

考虑一下这个情况,若拆分单词是 的结果有很多很多,岂不是这个表就很大,如何处理?
可以这样设计

拆分单词结果(ID)
窗前《静夜思》
《静夜思》
《静夜思》
明月《静夜思》;《水调歌头》
《静夜思》;《水调歌头》
《静夜思》;《水调歌头》
《静夜思》
几时《水调歌头》
《水调歌头》

根据拆分单词找到诗词名称,再根据诗词名称去查对应的内容。这样一个表就拆成两个表,就不大了。此外,这里的诗词名称就是唯一标识,在ES引擎中用 ID 表示。

从这里我们才真正的进入ES引擎

  1. 我们的数据格式是Json,存在文档中
{
	"id":"1",
	"title":"华为折叠手机",
	"price":"120.00"
}
-----------------------------------------
{
	"id":"2",
	"title":"三星翻盖手机",
	"price":"40.00"
}
-----------------------------------------
{
	"id":"3",
	"title":"华为移动翻盖手机",
	"price":"90.00"
}
  1. 自动拆分得到表
termvalue
华为1,3
折叠1
1,2,3
手机1,2,3
三星2
翻盖2,3
移动3

若term列数据很多,那直接从上往下一个个匹配也是会很慢的,因此ES引擎对词条term列做了优化。
在生成倒排索引(此表)后,词条会排序,形成一颗树形结构(又称为:字典树),提升词条的查询速度。

ES的定位:mysql的数据只要一更新,就将索引同步给ES,保证数据一致性
在这里插入图片描述

2 安装ES

2.1 环境

CentOS 7
elasticsearch-7.4.0-linux-x86_64.tar.gz

2.2 将安装包解压在opt目录下

在这里插入图片描述

2.3 解压

tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz -C /opt

在这里插入图片描述

2.3 修改elasticsearch.yml文件

在这里插入图片描述

cluster.name: my-application  //默认名称是elasticserach
node.name: node-1 
network.host: 0.0.0.0  //保证在windows上可以访问安装在centos上的ES引擎
http.port: 9200 
cluster.initial_master_nodes: ["node-1"]

2.4 启动报错

在这里插入图片描述
这是因为ES不推荐以root身份启动,而是推荐以用户身份启动
我们已经有用户zjh,只需要给其赋予启动权限就好
在这里插入图片描述

2.5 修改用户配置文件

  1. vim /etc/security/limits.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
  1. vim /etc/security/limits.d/20-nproc.conf
添加此信息
zjh soft nofile 65536
zjh hard nofile 65536
*   hard nproc  4096

在这里插入图片描述
3. vim /etc/sysctl.conf

添加此信息
 vm.max_map_count=655360
  1. sysctl -p

2.6 切换用户重启ES

启动前先暂时关闭防火墙
在这里插入图片描述
再启动
在这里插入图片描述
输入自己的虚拟机IP:9200
在这里插入图片描述

3 安装Kibana

Kibana版本必须和ES版本对应,避免出现不兼容的问题。

链接: Kibana下载

  1. 解压 tar -xzf kibana-7.4.0-linux-x86_64.tar.gz -C /opt
    在这里插入图片描述

2.修改配置文件vim /opt/kibana-7.4.0-linux-x86_64/config/kibana.yml

# 添加如下内容
server.port: 5601
server.hosts: "0.0.0.0"
server.name: "kibana-itcast"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
elasticsearch.requestTimeout: 99999

在这里插入图片描述

3.执行报错,需切换身份
在这里插入图片描述
4.切换身份执行

4 ES核心概念

本章节讲述如下几个概念:索引、映射、文档、倒排索引

这是一个mysql数据库处理数据的过程:创建表,将数据存储到对应字段(创建Movice表,Animal表结构)

在这里插入图片描述
这里我们也是创建表,不过在ES中不这样称呼,而是称之为建立索引。(创建Movice与Animal索引,并给索引Movice,索引Animla创建映射),然后存储数据,最后将相关字段进行分词。

在这里插入图片描述

5-8章节主要介绍在Kibana的可视化环境中,使用脚本进行相关操作,帮助熟悉ES

5 索引–基础操作

不能修改索引

5.1 创建索引

在这里插入图片描述

5.2 查询索引

在这里插入图片描述

5.3 添加映射

在这里插入图片描述

5.4 查询索引映射

在这里插入图片描述

在这里插入图片描述

5.5 删除索引

在这里插入图片描述

5.6 创建索引并添加映射

在这里插入图片描述

5.7 添加字段

在这里插入图片描述

6 文档–基础操作

6.1 添加文档,指定id

在这里插入图片描述

6.2 添加文档,不指定id

在这里插入图片描述

6.3 修改文档

在这里插入图片描述

6.4 查询所有文档

在这里插入图片描述

6.5 删除文档,根据id

在这里插入图片描述

7 分词器(analyze)

在这里插入图片描述
但是其对中文很不友好,使用ES的内置分词器,中文只会被分成一个一个字,中英文分别演示一下
中文彻底被拆分成了一个个字
在这里插入图片描述
英文是按照单词拆分的,并不是按照字母拆分。
在这里插入图片描述
因此若想要更好的中文分词效果,需要安装其他的分词器(如IK分词器),这里不介绍了。

8 文档查询

8.1 term

term:查询的条件字符串和词条完全匹配
例:查询与“美”相关的title
在这里插入图片描述
需要注意的是,ES默认使用的standard分词器,因此仅支持单独的汉字匹配,例如这样
在这里插入图片描述

若想要更改分词器,只能重新建立索引映射,同时设置分词器
在这里插入图片描述

8.2 match

会先对查询的字符串进行分词,再去查询,得到并集
例:将“美国”按照standard的分词器进行拆分,得到“美” “国”,分别查询,求并集。
在这里插入图片描述

9 与springboot的整合

在springboot中,我们一般只操作文档。在kibana使用脚本建立索引。这一章节介绍一下如何使用代码操作ES中的文档

9.1 简单获取cilent对象

ES将相关的操作都封装成在RestHighLevelClient 中,因此我们需要获取其对象才能进行相关操作
创建一个springboot项目,导入依赖

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.9.0</version>
        </dependency>

测试 获取ES客户端对象

@SpringBootTest
class EsDemoApplicationTests {

	/**
	* HttpHost的三个参数
	* 	1. 192.168.xx.xx:5601 地址是Kibana的地址和端口号
	* 	2. 9002 是ES的端口
	* 	3. scheme:http
	*/
    @Test
    void test01() {
       RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
               new HttpHost("ipxxxx:5601",9002,"http")
       ));

        System.out.println(client);
    }

}

成功获取client对象
在这里插入图片描述
获取了client就可以操作ES的文档

9.2 使用依赖注入方式优化获取Client

可以发现,我们直接将HttpHost的三个参数写死了,项目中不这样建议。

  1. 创建elasticsearch.yml文件
elasticsearch:
  host: 192.168.67.18:5601
  port: 9200
  1. 创建配置类(获取Client)
@Configuration
// 获取elasticsearch.yml文件信息,自动将elasticsearch.yml文件中elasticsearch开头的字段和ESconfig 类中的字段匹配并赋值
@ConfigurationProperties(prefix = "elasticsearch")
public class ESconfig {

    private String host;
    private int port;


    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    @Bean
    public RestHighLevelClient client(){
        //1. 创建ES客户端对象
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                new HttpHost(host, port, "http")));
        return client;
    }
}
  1. 测试
@SpringBootTest
class EsDemoApplicationTests {

    @Autowired
    private RestHighLevelClient client;
   
    @Test
    void test01() {
       /* RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
                new HttpHost("ipxxxx:5601",9002,"http")
        ));*/

        System.out.println(client);
    }



}

9.3 索引相关(了解)

9.3.1 创建索引

    /**
     * 创建索引
     */
    @Test
     void addIndex() throws IOException {
        //获取操作索引的对象
        IndicesClient indices = client.indices();

        //创建索引,获取返回值
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("movice");

        //设置映射mappings
        String mapping = "{\n" +
                "      \"properties\" : {\n" +
                "        \"addres\" : {\n" +
                "          \"type\" : \"text\"\n" +
                "        },\n" +
                "        \"id\" : {\n" +
                "          \"type\" : \"integer\"\n" +
                "        },\n" +
                "        \"price\" : {\n" +
                "          \"type\" : \"integer\"\n" +
                "        },\n" +
                "        \"title\" : {\n" +
                "          \"type\" : \"text\"\n" +
                "        }\n" +
                "      }";
        createIndexRequest.mapping(mapping, XContentType.JSON);

        
        CreateIndexResponse response = indices.create(createIndexRequest, RequestOptions.DEFAULT);

        //根据返回值判断结构:成功了返回true
        System.out.println(response.isAcknowledged());
    }

也就是这效果
在这里插入图片描述

9.3.2 查询索引


    /**
     * 查询索引
     */
    @Test
    void queryIndex() throws IOException {
        //获取操作索引的对象
        IndicesClient indices = client.indices();

        //根据索引名称查询
        GetIndexRequest getIndexRequest = new GetIndexRequest("movice");
        GetIndexResponse response = indices.get(getIndexRequest, RequestOptions.DEFAULT);

        //获取映射信息
        Map<String, MappingMetadata> mappings = response.getMappings();
        for (String key: mappings.keySet()){
            System.out.println(key + ":" + mappings.get(key).getSourceAsMap());
            
        }
        
    }

最后获得的结果是这一部分
在这里插入图片描述
解释代码
key:索引名称
mappings.get(key):索引对象
mappings.get(key).getSourceAsMap():将数据转换为map集合

9.3.3 删除索引

    /**
     * 删除索引
     */
    @Test
    void deleteIndex() throws IOException {
        //获取操作索引的对象
        IndicesClient indices = client.indices();

        //根据索引名称删除
        DeleteIndexRequest request = new DeleteIndexRequest("movice");
        AcknowledgedResponse response = indices.delete(request, RequestOptions.DEFAULT);

        //成功返回true
        boolean acknowledged = response.isAcknowledged();
        System.out.println(acknowledged);


    }

9.3.4 判断索引是否存在

 /**
     * 判断索引是否存在
     */
    @Test
    void existsIndex() throws IOException {
        //获取操作索引的对象
        IndicesClient indices = client.indices();

        //根据索引名称删除
        GetIndexRequest request = new GetIndexRequest("movice");
        boolean exists = indices.exists(request, RequestOptions.DEFAULT);

        System.out.println(exists);


    }

9.4 文档相关(重点)

9.4.1 添加文档

按照这样的思路去撰写
在这里插入图片描述

在这里插入图片描述

但是一般我们不这样存入数据,不会一个个put,而是从数据库中拉取数据,封装成对象,存入文档

升级改造

  1. 创建索引的类(movice类)
public class movice {

    private Integer  id;
    private String title;
    private Integer price;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "movice{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", price=" + price +
                ", address='" + address + '\'' +
                '}';
    }
}
  1. 使用类传入数据
 /**
     * 添加文档(升级改造):使用对象作为数据
     */
    @Test
    void addDoc2() throws IOException {
        movice movice = new movice();
        movice.setId(1); //此为索引ID
        movice.setTitle("国产动作电影(我被修改了)");
        movice.setPrice(40);
        movice.setAddress("香港");

        //将对象转换为json
        String data = JSON.toJSONString(movice);


        // 获取操作文档的对象:文档的ID设置为1
        IndexRequest request = new IndexRequest("movice").id("1").source(data,XContentType.JSON);

        IndexResponse response = client.index(request, RequestOptions.DEFAULT);

        //索引ID
        System.out.println(response.getId());

    }

9.4.2 修改文档

还是添加相关的操作,只不过若添加的时候,ID已经存在了,就会被修改。不存在就会创建新的

9.4.3 根据ID查询文档

    /**
     * 查询文档:根据ID查询
     */
    @Test
    void queryDoc2() throws IOException {

       //GetRequest getrequest = new GetRequest("movice"); //指定索引名称
        GetRequest getrequest = new GetRequest("1"); //指定索引ID
        
        GetResponse response = client.get(getrequest, RequestOptions.DEFAULT);
		
		//将对象的source部分数据以字符串的形式处理,前面是以map形式处理
        System.out.println(response.getSourceAsString());

    }

response相应也就是这一部分数据。
在这里插入图片描述

9.4.4 删除文档

 /**
     * 根据ID删除文档
     */
    @Test
    void deleteDoc2() throws IOException {

        DeleteRequest request = new DeleteRequest("1");

        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);

        //获取数据中的_id,注意不是_source中的id哦
        System.out.println(response.getId());

    }

我们可能会疑惑,这个response到底是什么数据,这就是response全部数据,我们可以获取_id,_source,_index等等,但是直接
在这里插入图片描述

总结:其实可以发现,使用代码进行索引,文档的操作时候。一定要了解5-8章节的细节:如何指定ID查询,增删查操作返回的数据。然后再去看代码,一一对照。
在代码中

  1. 先获得RestHighLevelClient对象 client(熟记如何获取)
  2. 上述所操作的类梳理在这里插入图片描述
    非常清晰的看到如何使用代码操作ES。

在下一篇文章将会介绍更高级的操作,熟悉企业开发。

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

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

相关文章

聊聊springcloud如何与k8s configMap整合实现配置动态刷新

前言 配置中心在微服务的服务治理场景基本上是属于标配&#xff0c;常见可以用来做配置中心有nacos、apollo、zookeeper、springcloud config、consul、etcd、redis、disconf、dimond、xxl-conf等。这些组件的特点都是需要安装&#xff0c;如果大家的部署环境中有用到k8s&…

创意项目管理软件推荐:满足客户需求的完美解决方案

发现功能强大的工作管理软件&#xff0c;让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板&#xff0c;花更少的时间在管理上&a…

Verilator仿真环境搭建

Verilator简介与使用_Hwang_shuo的博客-CSDN博客 Verilator是一种开源的Verilog/SystemVerilog仿真器&#xff0c;可用于编译代码以及代码在线检查&#xff0c;Verilator能够读取Verilog或者SystemVerilog文件&#xff0c;并进行lint checks(基于lint工具的语法检测)&#xff…

第六章:Linux基础IO

系列文章目录 文章目录 系列文章目录前言打开文件预备知识回顾C文件IO操作C语言I/O库函数fopen/fcloseperrorfwrite/freadfgets/fputsprintf/fprintf/sprintf/snprintfstdin/stdout/stderr 标志位系统调用IO接口open/closeumaskwrite/read lseek库函数IO操作与系统调用IO操作比…

ubuntu 20.0.4 搭建nvidia 显卡环境

一、安装docker 1、安装dokcer sudo apt install docker.io2、docker 添加到用户组 创建docker用户组 sudo groupadd docker添加当前用户加入docker用户组 sudo usermod -aG docker ${USER}重启docker服务 sudo systemctl restart docker切换或者退出当前账户再从新登入 …

【单片机】51单片机,晨启科技,板子引脚对应关系

一般引脚: sbit beepP2^4; //将单片机的P2.4端口定义为beep.本口用于屏蔽上电后蜂鸣器响 sbit ledP1^0; //将单片机的P1.0端口定义为led&#xff0c;用于点亮LED-D1 sbit DIG1P0^0; //数码管位选1 sbit DIG2P0^1; //数码管位选2P10xFF;//初始化P1引脚全部置高&a…

【计算机网络】第四章 IPv4

文章目录 4.3 IPv44.3.1 IPv4 地址概述4.3.2 分类编址的 IPv4 地址 4.3 IPv4 IPv4是互联网协议第四版&#xff08;Internet Protocol version 4&#xff09;的简称。它是现今互联网最常用的网络层协议&#xff0c;为互联网上的设备提供了唯一的逻辑地址&#xff0c;用于在网络…

【电机绘图】:插补算法(一)—直线插补—逐点比较法

今日介绍学习一种使用电机作画、绘图、加工零件时需要使用的算法 &#xff1a; 插补算法 本文提供直线插补的概念基础&#xff0c;基本思路分析&#xff0c;C语言实现等&#xff0c;代码会直接贴出&#xff01; 插补算法是指在数值计算或数据处理中&#xff0c;根据已有的数据…

Windows环境利用QT+CMake编译mingw版本的opencv

Opencv官网没有提供mingw版本的opencv库&#xff0c;所以需要自己编译&#xff0c;下面是编译过程&#xff0c;32位64位方法类似。 可以直接下载编译好的mingw版本opencv4.4&#xff1a; 使用CMAKE3.22QT5.13编译后的opencv4.4&#xff08;32位的&#xff09;资源-CSDN文库 …

【win10专业版远程控制】 自带远程桌面公司内网电脑

使用win10专业版自带远程桌面公司内网电脑 文章目录 使用win10专业版自带远程桌面公司内网电脑 在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数…

Nginx环境搭建、docker安装

1.Nginx安装 1&#xff09;首先创建Nginx的目录并进入 [rootlucky ~]# mkdir /soft && mkdir /soft/nginx/ [rootlucky ~]# cd /soft/nginx/ [rootlucky nginx]# 2&#xff09;下载Nginx的安装包&#xff0c;可以通过FTP工具上传离线环境包&#xff0c;也可通过wget命…

数据标注对新零售的意义及人工智能在新零售领域的应用?

数据标签对于新零售至关重要&#xff0c;因为它构成了训练和部署人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;模型的基础。在新零售的背景下&#xff0c;数据标签涉及对数据进行分类、标记或注释以使其能够被机器理解的过程。然后&#xff0c;这些…

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

效率利器之事件委托

前言 公司产品部推出了一款新产品&#xff0c;经理指派小A负责推广工作。小A通过多方打听了解到推广流程&#xff0c;需要使用公司证件在几个平台注册账号&#xff0c;并经过多轮审批。小A经历了一番操作后感到身心俱疲&#xff0c;最终成功将产品发布到公众平台上。 与此同时…

GB:重测序+转录2023经典文章,一篇就够

在三代测序崛起的现在&#xff0c;HiFi Reads以其超长读长&#xff0c;高准确率及灵敏度、GC偏向性小、无PCR偏向性等特色优势在动植物基因组、微生态领域等研究中正崭露头角&#xff0c;成为组学研究技术的新热门。高品质的HiFi Reads成为攻克动植物基因组组装难点的有力助推&…

SNAP插件sen2Three去云操作

1.先把这篇文章看了 2.去官网下载Sen2Three 3.这时候可以大概看看Sen2Three的官方文档&#xff0c;我们知道了需要用anaconda2环境 4.我是已经安装有anaconda3,所以需要两个并存&#xff0c;此时可以参考这篇文章 5.这是ananconda2的链接&#xff0c;直接下载安装即可&#xff…

南卡签约游泳冠军傅园慧,创造防水运动耳机的新天花板!

近日&#xff0c;国内骨传导运动耳机龙头品牌NANK南卡&#xff0c;正式官宣知名游泳冠军傅园慧出任品牌形象大使。在此之外&#xff0c;南卡品牌方还特邀了同样作为游泳冠军的孙杨&#xff0c;以及知名演员张新成、流行歌手段奥娟等多位明星来体验旗下的运动耳机&#xff0c;皆…

Python中搭建IP代理池的妙招

在Python的爬虫世界里&#xff0c;你是否也想搭建一个功能强大的IP代理池&#xff0c;让你的爬虫无忧无虑地畅游各大网站&#xff1f;今天&#xff0c;我就来教你使用Scrapy框架搭建IP代理池&#xff0c;让你的爬虫更加智能、高效&#xff01;跟着我一步一步来&#xff0c;轻松…

天津最新python培训班就业形势 python能就业吗?

小编认为Python是一门非常适合学习的编程语言&#xff0c;无论性别如何。它易于学习、功能强大&#xff0c;并且在各个领域都有广泛的应用&#xff0c;因此&#xff0c;性别不应该成为学习Python的障碍&#xff0c;那么学习Python是否就能找到满意的工作呢&#xff1f; 这是一…

PyTorch深度学习实战(10)——过拟合及其解决方法

PyTorch深度学习实战&#xff08;10&#xff09;——过拟合及其解决方法 0. 前言1. 过拟合基本概念2. 添加 Dropout 解决过拟合3. 使用正则化解决过拟合3.1 L1 正则化3.2 L2 正则化 4. 学习率衰减小结系列链接 0. 前言 过拟合 (Overfitting) 是指在机器学习中&#xff0c;模型…