基于 centos7 搭建 laravel+scout+elasticsearch+ik-analyzer 用于中文分词全文检索服务及测试

news2025/1/2 2:35:06

目录

  • 基于 centos7 搭建 laravel+scout+elasticsearch+ik-analyzer 用于中文分词全文检索服务及测试
    • 相关软件及版本
    • 安装或升级jdk(版本:19.0.2)
    • 安装es(版本:8.1.1)
    • 安装ik-analyzer(版本:8.1.1)
    • laravel 7框架安装laravel-scout-elastic包
    • 在laravel中使用es进行中文分词及查询
    • 代码优化
      • 方案一
      • 方案二
    • 异常问题

基于 centos7 搭建 laravel+scout+elasticsearch+ik-analyzer 用于中文分词全文检索服务及测试

浏览该文章,建议先食用 异常问题 这一节

相关软件及版本

软件/框架版本
jdk19.0.2
elasticsearch8.1.1
ik-analyzer8.1.1
laravel7.x-dev
elasticsearch/elasticsearch7.17.1
tamayo/laravel-scout-elastic8.0.3

安装或升级jdk(版本:19.0.2)

  • 下载jdk传送门

  • 安装

    下载:wget https://download.oracle.com/java/19/latest/jdk-19_linux-x64_bin.rpm
    安装:rpm -ivh jdk-19_linux-x64_bin.rpm

  • 查看版本

    java -version

安装es(版本:8.1.1)

  • 下载传送门

  • 安装

    下载:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.1-x86_64.rpm
    安装:rpm -ivh elasticsearch-8.1.1-x86_64.rpm

  • 编辑配置项

    vim /etc/elasticsearch/elasticsearch.yml
    直接从最后一行添加如下内容:

    #bootstrap.memory_lock: true
    #network.host: localhost
    http.port: 9200
    
    bootstrap.memory_lock: false
    network.host: 0.0.0.0
    discovery.seed_hosts: ["127.0.0.1"]
    cluster.initial_master_nodes: ["node-1"]
    
    xpack.security.enabled: false
    #xpack.security.http.ssl:
    #  enabled: false
    #  keystore.path: certs/http.p12
    
    #解决[.geoip_databases]  index are active  问题
    ingest.geoip.downloader.enabled: false
    ##允许跨域
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    

    保存并退出。

  • 启动es服务

    设置开机启动:systemctl enable elasticsearch
    启动服务:systemctl start elasticsearch
    提示错误:
    在这里插入图片描述问题描述:内存空间不足
    解决方案:
    vim /etc/elasticsearch/jvm.options
    找到-Xms4g 和 -Xmx4g 打开注释并修改为:
    -Xms512m
    -Xmx512m
    保存并退出。
    重新启动es服务:
    systemctl restart elasticsearch
    提示错误:
    在这里插入图片描述问题描述:不能使用root用户,所以需要创建es专用用户和组
    解决方案:
    创建用户组:
    groupadd elasticsearch
    创建用户及所属组:
    useradd -g elasticsearch elasticsearch
    设置密码:
    elasticsearch
    设置 /opt/software/install/elasticsearch-8.6.2 目录权限为elasticsearch用户和组拥有:
    chown -R elasticsearch:elasticsearch /opt/software/install/elasticsearch-8.6.2
    切换到 elasticsearch 用户:
    su elasticsearch
    再次启动es服务:
    systemctl restart elasticsearch
    提示错误:
    在这里插入图片描述
    问题描述:exception during geoip databases updateorg.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active
    解决方案:
    vim /opt/software/install/elasticsearch-8.6.2/config/elasticsearch.yml
    在文件夹的最后一行添加:
    #解决[.geoip_databases] index are active 问题
    ingest.geoip.downloader.enabled: false
    #允许跨域
    http.cors.enabled: true
    http.cors.allow-origin: “*”
    再次启动es服务:
    systemctl restart elasticsearch
    不再提示错误,表示启动成功:
    在这里插入图片描述

    执行命令:
    curl localhost:9200
    在这里插入图片描述
    说明es安装成功。
    浏览器访问:ip:9200,也能得到上图结果:
    在这里插入图片描述

  • 如果用的是云服务器(如阿里云),需要配置安全组开放9200端口。

  • 如果服务器开启了防火墙,需要开放9200端口。

安装ik-analyzer(版本:8.1.1)

  • 下载传送门

    注意:为避免出现问题,版本需要和es完全一致。

  • 安装

    /usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.1.1/elasticsearch-analysis-ik-8.1.1.zip
    
  • 重启es

    systemctl restart elasticsearch

  • 测试分词效果

    curl -H 'Content-Type: application/json'  -XGET 'localhost:9200/_analyze?pretty' -d '{"analyzer":"ik_max_word","text":"张三丰创建了武当派"}'
    

    在这里插入图片描述
    可以看到 分词效果还是不错的,但是“张三丰”这个名字却被分成了3个,还好强大的 analysis-ik 支持自定义词库,增加自定义词库:
    vim /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
    在这里插入图片描述
    增加一个自定义词库,并向其中导入自定义内容,如通过名利写入:
    echo ‘张三丰’ > /etc/elasticsearch/analysis-ik/custom.dic
    再看下分词效果,明显好转:
    在这里插入图片描述

laravel 7框架安装laravel-scout-elastic包

  • 安装

    composer.json文件中require对象加入elasticsearch包和laravel-scout-elastic
    在这里插入图片描述
    执行 composer update 完成相关包下载。

  • 在config/app.php 的 providers 数组中添加:

    \Laravel\Scout\ScoutServiceProvider::class,
    \Tamayo\LaravelScoutElastic\LaravelScoutElasticProvider::class,

  • 执行命令:

    php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider
    config目录会生成一个scout.php配置文件。

  • 修改scout.php配置文件

    	'driver' => env('SCOUT_DRIVER', 'elasticsearch'),
    	
     //在最后添加
     //配置elasticsearch引擎
     'elasticsearch' => [
          'index' => env('ELASTICSEARCH_INDEX', 'laravel'),//laravel就是索引的名字,可以随便起
          'hosts' => [
              env('ELASTICSEARCH_HOST', 'http://127.0.0.1:9200'),
          ],
      ]
    
  • env配置如下:

    #elasticsearch
    SCOUT_DRIVER=elasticsearch
    ELASTICSEARCH_INDEX=laravel7
    ELASTICSEARCH_HOST=http://127.0.0.1:9200
    ELASTIC_CLIENT_APIVERSIONING=1
    

在laravel中使用es进行中文分词及查询

  • 自动更新索引

    执行命令:php artisan make:command ESInit

  • 在 app\Console\Kernel.php 里增加ESInit类

    protected $commands = [
    	\App\Console\Commands\ESInit::class
    ];
    
  • 编写ESInit类模板内容,完整代码如下:

    	<?php
    
    namespace App\Console\Commands;
    
    use GuzzleHttp\Client;
    use Illuminate\Console\Command;
    
    class ESInit extends Command
    {
        /**
         * The name and signature of the console command.
         *
         * @var string
         */
        protected $signature = 'es:init';
    
        /**
         * The console command description.
         *
         * @var string
         */
        protected $description = 'init laravel es for post';
    
        /**
         * Create a new command instance.
         *
         * @return void
         */
        public function __construct()
        {
            parent::__construct();
        }
    
        /**
         * Execute the console command.
         *
         * @return int
         */
        public function handle()
        {
            $client = new Client();
            // 创建模版
            $url = config('scout.elasticsearch.hosts')[0] . '/_template/tmp';
            try {
                $client->delete($url);
            } catch (\Exception $e) {
                $this->info("===delete模版出现错误===" . $e->getMessage());
            }
    
            /*
             * 这个模板作用于我要做用的索引
             * */
            $param = [
                'json' => [
                    /*
                     * 这句是取在scout.php(scout是驱动)里我们配置好elasticsearch引擎的
                     * index项。
                     * PS:其实都是取数组项,scout本身就是return一个数组,
                     * scout.elasticsearch.index就是取
                     * scout[elasticsearch][index]
                     * */
                    'template' => config('scout.elasticsearch.index'),
                    'mappings' => [
                        '_default_' => [
                            'dynamic_templates' => [
                                [
                                    'string' => [
                                        'match_mapping_type' => 'string',//传进来的是string
                                        'mapping' => [
                                            'type' => 'text',//把传进来的string按text(文本)处理
                                            'analyzer' => 'ik_smart',//用ik_smart进行解析(ik是专门解析中的插件)
                                            'fields' => [
                                                'keyword' => [
                                                    'type' => 'keyword'
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ],
                ],
            ];
            try {
                $client->put($url, $param);
            } catch (\Exception $e) {
                $this->info("===put模版出现错误===" . $e->getMessage());
            }
    
            $this->info('============create template success============');
    
            //创建index
            $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');
            try {
                $client->delete($url);
            } catch (\Exception $e) {
                $this->info("===delete索引出现错误===" . $e->getMessage());
            }
    
            $param = [
                'json' => [
                    'settings' => [
                        'refresh_interval' => '5s',
                        'number_of_shards' => 1,
                        'number_of_replicas' => 0,
                    ],
    
                    'mappings' => [
                        '_default_' => [
                            '_all' => [
                                'enabled' => false
                            ]
                        ]
                    ]
                ]
            ];
    
            try {
                $client->put($url, $param);
            } catch (\Exception $e) {
                $this->info("===put索引出现错误===" . $e->getMessage());
            }
            $this->info('============create index success============');
        }
    }
    
  • 启动 ES自动更新索引服务

    php artisan es:init

  • 修改你要搜索的 model,以 Project 为例:

    模型类 Project 引入 Searchable 工具类:use Searchable;
    在这里插入图片描述

  • 模型类 Project 中重写 searchableAs () 方法 toSearchableArray () 方法

    /**
         * @return string
         */
        public function searchableAs() {
            return $this->getTable();
        }
    
        /**
         * 索引的字段
         * @return array
         */
        public function toSearchableArray() {
            return [
                'project_name' => $this->project_name,
                'nick_name' => $this->nick_name,
            ];
        }
    

    在这里插入图片描述

  • 导入数据处理:

    php artisan scout:import “App\Models\Project”
    在这里插入图片描述出现上图情况,表示导入数据成功。

  • 编写查询代码

    • 路由
      //es测试
      $route->get('es_project','ProjectController@esProject')->name('api_v1_esProject');
      
    • 控制器
      public function esProject(Request $request)
      {
          return $this->success(
              $this->homeProjectServ->esProjectServ($request->all())
          );
      }
      
    • 服务层
      public function esProjectServ(array $params)
      {
          $searchWord = $params['search_word'] ?? '义厂';
          //DB::enableQueryLog();
          $list = $this->model->search($searchWord)->get()->toArray();
          //dd($searchWord, DB::getQueryLog());
      
          return ['list' => $list];
      }
      
    • postman调用测试结果:
      在这里插入图片描述发现没查询到想要的结果,多方查找,终于找到问题所在,这篇文章 给出了答案,在文件 vendor/tamayo/laravel-scout-elastic/src/Engines/ElasticsearchEngine.php 中,第134行的前后两个 * 导致查询结果不达预期(可能是作者未考虑中文分词)。那么,找到问题就容易解决了,直接把前后 * 删掉即可
      删除前:
      在这里插入图片描述
      删除后:
      在这里插入图片描述
      再次查询结果如下: 在这里插入图片描述至此,es 安装、ik中文分词、在 laravel 中使用已经完成。

代码优化

上面直接修改了 composer 下载的vendor包里的代码,是不优雅的,且在 composer install 或 composer update 后会被覆盖,那么有没有更好的处理方案呢?答案是有的,下面给出两种解决方案。两种方案都是基于重写包里对应方法的思想,方案一是通过AppServiceProvider的boot方法调用实现;方案二是通过自定义 provider 实现,下面是具体实现。

方案一

  • app/Libraries 目录下新增目录:CustomScoutElastic

  • 创建类文件:app/Libraries/CustomScoutElastic/CustomElasticsearchEngine.php
    该类为了重写 vendor 包内 vendor/tamayo/laravel-scout-elastic/src/Engines/ElasticsearchEngine.php 类内的 performSearch 方法。

    <?php
    
    namespace App\Libraries\CustomScoutElastic;
    
    use Laravel\Scout\Builder;
    use Tamayo\LaravelScoutElastic\Engines\ElasticsearchEngine;
    
    /**
     * 自定义es引擎,重写 performSearch 方法,解决134行(本文件28行)*导致跨字符查询无结果的问题
     */
    class CustomElasticsearchEngine extends ElasticsearchEngine
    {
        /**
         * Perform the given search on the engine.
         *
         * @param  Builder  $builder
         * @param  array  $options
         * @return mixed
         */
        protected function performSearch(Builder $builder, array $options = [])
        {
            $params = [
                'index' => $builder->model->searchableAs(),
                'type' => get_class($builder->model),
                'body' => [
                    'query' => [
                        'bool' => [
                            'must' => [['query_string' => ['query' => "{$builder->query}"]]]
                        ]
                    ]
                ]
            ];
    
            if ($sort = $this->sort($builder)) {
                $params['body']['sort'] = $sort;
            }
    
            if (isset($options['from'])) {
                $params['body']['from'] = $options['from'];
            }
    
            if (isset($options['size'])) {
                $params['body']['size'] = $options['size'];
            }
    
            if (isset($options['numericFilters']) && count($options['numericFilters'])) {
                $params['body']['query']['bool']['must'] = array_merge(
                    $params['body']['query']['bool']['must'],
                    $options['numericFilters']
                );
            }
    
            if ($builder->callback) {
                return call_user_func(
                    $builder->callback,
                    $this->elastic,
                    $builder->query,
                    $params
                );
            }
    
            return $this->elastic->search($params);
        }
    }
    
  • 创建类文件:app/Libraries/CustomScoutElastic/CustomElasticsearch.php
    该类继承并重写 vendor 包内 vendor/tamayo/laravel-scout-elastic/src/LaravelScoutElasticProvider.php 类内的 boot 方法

    <?php
    
    namespace App\Libraries\CustomScoutElastic;
    
    use Elasticsearch\ClientBuilder;
    use Laravel\Scout\EngineManager;
    use Tamayo\LaravelScoutElastic\LaravelScoutElasticProvider;
    
    class CustomElasticsearch extends LaravelScoutElasticProvider
    {
        /**
         * 重写 laravel-scout-elastic 包 LaravelScoutElasticProvider 类 的 boot 方法
         * @throws \Exception
         */
        public function customBootFromLaravelScoutElasticProvider()
        {
            try {
                $this->ensureElasticClientIsInstalled();
    
                resolve(EngineManager::class)->extend('elasticsearch', function () {
                    return new CustomElasticsearchEngine(
                        ClientBuilder::create()
                            ->setHosts(config('scout.elasticsearch.hosts'))
                            ->build()
                    );
                });
            } catch (\Exception $e) {
                throw new \Exception($e->getMessage(), $e->getCode());
            }
        }
    }
    
  • 编辑文件:app/Providers/AppServiceProvider.php
    use相关类(new时会自动引入),此文件boot()方法中加入相关内容,如下:

    use App\Libraries\CustomScoutElastic\CustomElasticsearch;
    
    /**
      * Bootstrap any application services.
      * @throws \Exception
      */
    public function boot()
    {
        try {
            //重写 laravel-scout-elastic 包 LaravelScoutElasticProvider 类 的 boot 方法
            $customElasticsearch = new CustomElasticsearch($this->app);
            $customElasticsearch->customBootFromLaravelScoutElasticProvider();
        } catch (\Exception $e) {
            throw new \Exception($e->getMessage(), $e->getCode());
        }
    }
    
  • 至此,不侵入vendor包代码的方案一就完成了,测试依然可用:
    在这里插入图片描述

方案二

  • app/Libraries目录下新增目录:CustomScoutElastic

  • 创建类文件:app/Libraries/CustomScoutElastic/CustomElasticsearchEngine.php
    该类为了重写vendor包内 vendor/tamayo/laravel-scout-elastic/src/Engines/ElasticsearchEngine.php 类内的 performSearch 方法。

    <?php
    
    namespace App\Libraries\CustomScoutElastic;
    
    use Laravel\Scout\Builder;
    use Tamayo\LaravelScoutElastic\Engines\ElasticsearchEngine;
    
    /**
     * 自定义es引擎,重写 performSearch 方法,解决134行(本文件28行)*导致跨字符查询无结果的问题
     */
    class CustomElasticsearchEngine extends ElasticsearchEngine
    {
        /**
         * Perform the given search on the engine.
         *
         * @param  Builder  $builder
         * @param  array  $options
         * @return mixed
         */
        protected function performSearch(Builder $builder, array $options = [])
        {
            $params = [
                'index' => $builder->model->searchableAs(),
                'type' => get_class($builder->model),
                'body' => [
                    'query' => [
                        'bool' => [
                            'must' => [['query_string' => ['query' => "{$builder->query}"]]]
                        ]
                    ]
                ]
            ];
    
            if ($sort = $this->sort($builder)) {
                $params['body']['sort'] = $sort;
            }
    
            if (isset($options['from'])) {
                $params['body']['from'] = $options['from'];
            }
    
            if (isset($options['size'])) {
                $params['body']['size'] = $options['size'];
            }
    
            if (isset($options['numericFilters']) && count($options['numericFilters'])) {
                $params['body']['query']['bool']['must'] = array_merge(
                    $params['body']['query']['bool']['must'],
                    $options['numericFilters']
                );
            }
    
            if ($builder->callback) {
                return call_user_func(
                    $builder->callback,
                    $this->elastic,
                    $builder->query,
                    $params
                );
            }
    
            return $this->elastic->search($params);
        }
    }
    
  • App\Providers 目录下创建provider类文件:CustomLaravelScoutElasticProvider.php
    具体路径为:app/Providers/CustomLaravelScoutElasticProvider.php
    该类继承并重写 vendor 包内 vendor/tamayo/laravel-scout-elastic/src/LaravelScoutElasticProvider.php 类内的 boot 方法:

    <?php
    
    namespace App\Providers;
    
    
    use App\Libraries\CustomScoutElastic\CustomElasticsearchEngine;
    use Elasticsearch\ClientBuilder;
    use Laravel\Scout\EngineManager;
    use Tamayo\LaravelScoutElastic\LaravelScoutElasticProvider;
    
    /**
     * 自定义 LaravelScoutElastic 服务提供者,用于重写 LaravelScoutElasticProvider 类的boot方法
     * 解决134行(本文件28行)*导致跨字符查询无结果的问题
     */
    //class CustomLaravelScoutElasticProvider extends LaravelScoutElasticProvider
    class CustomLaravelScoutElasticProvider extends LaravelScoutElasticProvider
    {
        /**
         * Bootstrap the application services.
         * @throws \Exception
         */
        public function boot()
        {
            try {
                $this->ensureElasticClientIsInstalled();
    
                resolve(EngineManager::class)->extend('elasticsearch', function () {
                    return new CustomElasticsearchEngine(
                        ClientBuilder::create()
                            ->setHosts(config('scout.elasticsearch.hosts'))
                            ->build()
                    );
                });
            } catch (\Exception $e) {
                throw new \Exception($e->getMessage(), $e->getCode());
            }
        }
    
        /**
         * Register any application services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    
  • config/app.php 文件 providers 加载创建的 CustomLaravelScoutElasticProvider 类

    \App\Providers\CustomLaravelScoutElasticProvider::class,
    
  • 至此,不侵入 vendor 包代码的方案二就完成了,测试依然可用:
    在这里插入图片描述

异常问题

  • 软件安装过程中遇到了各种各样的问题,最终确定了 es8.1.1 版本,注意 ik 版本需要和 es 版本绝对一致。

  • 使用方案二过程中,如果代码都写好了,还是无效,建议清除 bootstrap/cache 内文件后重新请求,可能是 provider 缓存导致的。

*******************************只要思想不滑坡,办法总比困难多*******************************

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

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

相关文章

transformer目标检测开山之作detr

1. 将一个batch的图片输入backone获得feature。 &#xff08;2&#xff0c;c&#xff0c;w&#xff0c;h&#xff09;先输入resnet50中&#xff0c;得到&#xff08;2&#xff0c;2048&#xff0c;w&#xff0c;h&#xff09;。虽然这里channel不是256&#xff0c;但是在输入e…

pg mysql oracle 中的schema

1、schema。 pg中的schema表示当前db中数据库对象的命名空间(namespace)&#xff0c;数据库对象包括但不限于表、函数、视图、索引等。 对于熟悉mysql的人来说&#xff0c;在第一次看到pg中的schema的概念时&#xff0c;可能会疑惑&#xff0c;schema不是表示database的吗&…

如何使用码匠连接 Elasticsearch

目录 在码匠中集成 Elasticsearch 在码匠中使用 Elasticsearch 关于码匠 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;常用于处理大规模数据集的搜索、实时数据分析和数据挖掘任务。它支持多种数据源&#xff0c;包括关系型数据库&#xff08;如 MySQL、Pos…

不想重写Dockerfile如何更改docker容器的挂载目录

一、问题 从网络上下载的很多Dockerfile或docker-compose文件进行启动容器的时候&#xff0c;部分重要的目录是依赖volumes挂载到容器内部的&#xff0c;如图 这就会出现一个问题&#xff0c;当我们想将容器打包&#xff0c;便于以后使用的时候&#xff0c;这部分挂载的文件是…

ArcGIS中地形渲染图制作技巧

01 概述 DEM数据作为GIS数据中常见的一种数据&#xff0c;经常都会使用到&#xff0c;除了用来生成等高线、高程点和做各种分析之外&#xff0c;生成地形渲染图也是常见的用途之一&#xff0c;这里给大家介绍一下ArcGIS中地形渲染图制作技巧&#xff0c;希望能够对大家有所帮…

领英开发外贸客户新方式—领英精灵

一、领英精灵是什么&#xff1f; 领英精灵是在LinkedIn领英这个全球最大的职业社交平台基础上研发出的一款工具软件&#xff0c;领英精灵最初研发定位是帮助那些想要在LinkedIn领英上挖掘开发客户需求的人群使用&#xff0c;但他的功能又不仅仅局限于外贸行业。干一行说一行&a…

Java知识复习(十一)RabbitMQ

1、RabbitMQ简介 RabbitMQ 是采用 Erlang 语言实现 AMQP(Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;的消息中间件 2、RabbitMQ核心概念 RabbitMQ 整体上是一个生产者与消费者模型&#xff0c;主要负责接收、存储和转发消息 3、Producer和…

Zookeeper3.5.7版本——集群部署(linux环境-centos7)

目录一、三台服务器信息二、Zookeeper3.5.7官网下载2.1、官网下载地址2.2、下载步骤三、三台服务器都安装jdk11&#xff08;Zookeeper需要jdk支持&#xff09;四、Zookeeper3.5.7集群部署4.1、centos7虚拟机1 &#xff08;192.168.136.27&#xff09;服务器安装步骤4.1.1、解压…

day23_多线程基础

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、进程与线程 三、创建线程 四、线程的API 五、线程状态 六、线程同步 零、 复习昨日 晨考 一、作业 见答案 二、进程与线程[了解] 一个进程就…

上海分时电价机制调整对储能项目的影响分析

安科瑞 耿敏花 2022年12月16日&#xff0c;上海市发改委发布《关于进一步完善我市分时电价机制有关事项的通知》(沪发改价管〔2022〕50号)。通知明确上海分时电价机制&#xff0c;一般工商业及其他两部制、大工业两部制用电夏季&#xff08;7、8、9月&#xff09;和冬季&#x…

MyBatis底层原理【源码运行时序图】

MyBatis初始化流程&#x1f6f7; 以下代码为例&#x1f389; &#x1f387;可对应源码阅读 MyBatis初始化流程✨ #mermaid-svg-yoG1e8Dnp3UIAOUW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yoG1e8Dnp3UIAOU…

robotframework 常用关键字

ctrl shift 空格&#xff1a;自动补全关键字 F5&#xff1a;搜索关键字 F8&#xff1a;执行用例 ctrl shift s&#xff1a;保存整个工程 ctrl r&#xff1a;查看报告 ctrl 鼠标悬浮&#xff1a;显示关键字的信息 ctrl #&#xff1a;屏蔽代码 ctrl $&#xff1a;…

4-spring篇

ApplicationContext refresh的流程 12个步骤 prepareRefresh 这一步创建和准备了Environment对象&#xff0c;并赋值给了ApplicationContext的成员变量 要理解Environment对象的作用 obtainFreshBeanFactory ApplicationContext 里面有一个成员变量&#xff0c;Beanfactory b…

Navicat 现已支持 OceanBase 全线数据库产品

Navicat 作为 OceanBase 生态工具的合作伙伴&#xff0c;这是双方产品适配第三个里程碑。2022 年 7 月的首个里程碑&#xff0c;Navicat 实现了 OceanBase 社区版的功能性兼容。同年10 月&#xff0c;进一步实现了针对 OceanBase 企业版&#xff08; 兼容 MySQL 模式&#xff0…

一文图解|I/O 调度层

当我们使用 read() 和 write() 系统调用向内核提交读写文件操作时&#xff0c;内核并不会立刻向硬盘发送 I/O 请求&#xff0c;而是先将 I/O 请求交给 I/O 调度层进行排序和合并处理。经过 I/O 调度层加工处理后&#xff0c;才会将 I/O 请求发送给块设备驱动进行最终的 I/O 操作…

【强烈建议收藏:MySQL面试必问系列之慢SQL优化专题】

一.知识回顾 学习本篇文章之前呢&#xff0c;我们可以先看一下【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】&#xff0c;看完这篇文章再来学习本篇文章可谓是如虎添翼。好的&#xff0c;那我们也不讲太多的废话&#xff0c;直接开始。 二.如何做慢SQL查询优化呢&…

《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置

如果进行开发的话&#xff0c;首先要配置路由页面 page.json 页面路由 pages.json 文件用来对 uni-app 进行全局配置&#xff0c;决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。 {"pages": [{"path": "pages/component/index…

Centos7搭建DHCP

1.简介DHCP服务器又叫动态主机协议&#xff0c;由服务器划分一段地址池&#xff0c;客户端地址池中获取IP地址及掩码等信息端口&#xff1a;UDP 67/68主配置文件&#xff1a;/etc/dhcp/dhcpd.conf租约时间文件&#xff1a;/etc/sysconfig/dhcpd2.简单搭建DHCP服务PS&#xff1a…

离线数据仓库项目--技术选择

文章目录&#xff08;一&#xff09;技术选型1&#xff09;数据采集工具2&#xff09;数据存储3&#xff09;数据计算4&#xff09;数据可视化&#xff08;二&#xff09;整体架构设计&#xff08;三&#xff09;服务器资源规划&#xff08;一&#xff09;技术选型 1&#xff…

MySQL索引事务

1.索引1.1概念索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结果实现。&#xff08;这里只用通俗的语言和图片进行介绍&#xff09;1.2作用数据库中的表…