Lucene从入门到精通

****************************************************************************************************************************************************************************

1、概述
【1】入门:作用、有点与缺点
【2】应用:索引、搜索、field域使用、索引库、分词器、高级搜岁实战
【3】高级:底层存储结构、词典排序算法、优化、使用的一些使用注意事项

****************************************************************************************************************************************************************************

2、Lucene的作用
【1】用户—>服务器—>Lucene API—>索引库—>数据库/文档/web网页—>再返回。

****************************************************************************************************************************************************************************

3、常用的查询算法
【1】顺序扫描法:(数据量大的时候就GG),mysql的like查询就是,文本编辑器的Ctrl+F。
【2】倒排索引:把文章提取出来—>文档(正文)—>切分词组成索引目录。查询的时候先查目录,然后再找正文。切分词是个关键。
为什么倒排索引快?去掉重复的词,去掉停用词(的、地、得、a、an、the)。查字词典肯定比文章少。字典原理所以快。
优点:准确率高、速度快。但是空间占用量肯定会大,时间与空间不能兼得。它是用空间换时间。额外占用磁盘空间来存储目录。

****************************************************************************************************************************************************************************

5、全文检索技术使用场景
【1】站内搜索(百度贴吧、京东、淘宝)。垂直领域的搜索(818工作网)。专业搜索引擎(谷歌、百度)

****************************************************************************************************************************************************************************

6、什么是Lucene
【1】文章—>词—>索引(目录)
【2】全文检索:查先查目录,再查文本,这就是全文检索。
【3】Doug Cutting是Lucene、Nutch、Hadoop等项目的发起人。捐献给了Apache基金会。
【4】官网 https://lucene.apache.org

****************************************************************************************************************************************************************************

7、索引和搜索流程概述
【1】原始文档—>创建索引(获得文档-构建文档对象-分词-创建索引)—>索引库(肯定是提前创建)。
【2】用户查询—>创建查询—>执行查询—>渲染结果—>返回结果。

****************************************************************************************************************************************************************************

8、Lucene索引流程详细
【1】Document文档(唯一ID)。Field域(key value的形式)。id:1 name:华为手机64G brandName:华为。id:2 name:华为手机128G brandName:华为
【2】会根据text提取分词,分析后得到的词:....................。关键词 1 在文档1,关键词2 在文档2 ,关键词手机 在文档1&文档2。这种方式存储。
【3】然后先找到关键词在哪个文档,然后再去对应文档查,有道理呀。卧槽

****************************************************************************************************************************************************************************

9、Lucene搜索流程详细
【1】华为手机,看是华为 AND 手机,还是华为 OR 手机。来决定查询结果

****************************************************************************************************************************************************************************

10、Lucene入门
【1】jar包下载配置<!--Lucene****************************************************************************************************************************************************--><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-highlighter --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-highlighter</artifactId><version>7.7.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-queryparser</artifactId><version>7.7.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-smartcn --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-smartcn</artifactId><version>7.7.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-analyzers-common</artifactId><version>7.7.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --><dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>7.7.2</version></dependency>

****************************************************************************************************************************************************************************

13、创建索引
【1】具体创建代码public static void createIndex() throws Exception {// 1.采集数据Product product_1 = new Product(1, "华为手机", 3000, 10, "华为.jpg", "华为", "300*300", 5);Product product_2 = new Product(2, "苹果手机", 8000, 30, "苹果.jpg", "苹果", "500*500", 15);List<Product> productList = new ArrayList<>();productList.add(product_1);productList.add(product_2);List<Document> documentList = new ArrayList<>(); // 文档集合// 2.创建文档对象for (Product temp : productList) {// 创建文档Document document = new Document();// 创建域对象,并且放到文档对象中document.add(new TextField("id", temp.getId() + "", Field.Store.YES));document.add(new TextField("name", temp.getName(), Field.Store.YES));document.add(new TextField("price", temp.getPrice() + "", Field.Store.YES));document.add(new TextField("num", temp.getNum() + "", Field.Store.YES));document.add(new TextField("image", temp.getImage() + "", Field.Store.YES));document.add(new TextField("brandName", temp.getBrandName() + "", Field.Store.YES));document.add(new TextField("spec", temp.getSpec() + "", Field.Store.YES));// 放到文档集合documentList.add(document);}// 3.创建分词器Analyzer analyzer = new StandardAnalyzer();// 4.创建index目录对象,目录对象表示索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建IndexWriterConfig对象, 这个对象指定切分词使用的分词器IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);// 6.创建IndexWriter输出流对象,指定输出位置和使用的config初始化对象。IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 7.写入文档到索引库for (Document temp : documentList) {indexWriter.addDocument(temp);}// 8.释放资源indexWriter.close();}

****************************************************************************************************************************************************************************

14、查看索引详情工具
【1】https://github.com/DmitryKey/luke/tree/luke-swing-8.0.0/src/main/java/org/apache/lucene/luke/app/desktop直接下载运行
【2】Luke工具的使用,很重要的!!!!!!!!!!!!

****************************************************************************************************************************************************************************

15、搜索索引
【1】实际代码
// 二、搜索public static void searchIndex() throws Exception {// 1.创建分词器(对搜索的内容进行分词使用)。如华为手机可能拆分为 华为 手机Analyzer analyzer = new StandardAnalyzer();// 注意!!!:分词器要和创建索引的时候使用的分词器一模一样(不然搜索的时候就有问题)// 2.创建查询对象  // 第一个arg默认查询域   //QueryParser queryParser = new QueryParser("name", analyzer);// 3.设置搜索关键词Query query = queryParser.parse("华为"); // queryParser.parse("id:华为手机") 指定从id查,不指定就从默认的name域查// 4.设置Directory目录对象,指定索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建输入流对象IndexReader indexReader = DirectoryReader.open(directory);// 6.创建搜索对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 7.搜索并返回结果TopDocs topDocs_10 = indexSearcher.search(query, 10);// 8.获取结果集ScoreDoc[] scoreDocArray = topDocs_10.scoreDocs;// 9.遍历结果集System.out.println("共查询到 " + scoreDocArray.length + " 条数据");if (scoreDocArray != null) {for (ScoreDoc temp : scoreDocArray) {// 获取查询到的文档唯一ID,这个ID是Lucene在创建文档的时候自动分配的。int docId = temp.doc;// 通过文档ID读取文档Document document = indexSearcher.doc(docId);System.out.println("******************************************************************************************************");System.out.println("id: " + document.get("id"));System.out.println("name: " + document.get("name"));System.out.println("price: " + document.get("price"));}}// 10. 关闭流indexReader.close();}

****************************************************************************************************************************************************************************

16、Field域的使用
【1】Field类:索引的目的是为了查询。比如商品ID、订单号、身份证号这个不用分词。凡是用来展示的都需要存储。
【2】所以每个属性都要进行是否分词、是否索引、是否存储的改造。// 2.创建文档对象for (Product temp : productList) {// 创建文档Document document = new Document();// 创建域对象,并且放到文档对象中document.add(new TextField("id", temp.getId() + "", Field.Store.YES));// 否 是 是(是为了查数据库)document.add(new TextField("name", temp.getName(), Field.Store.YES));// 是 是 是(因为页面需要展示商品名称)document.add(new IntPoint("price", temp.getPrice()));// 是(底层的逻辑) 是(根据范围查询) 是document.add(new StoredField("price", temp.getPrice()));// 与上面组合来完成存储document.add(new TextField("num", temp.getNum() + "", Field.Store.YES));document.add(new TextField("image", temp.getImage() + "", Field.Store.YES));document.add(new TextField("brandName", temp.getBrandName() + "", Field.Store.YES));  // 否 是 是document.add(new TextField("spec", temp.getSpec() + "", Field.Store.YES));// 放到文档集合documentList.add(document);}

****************************************************************************************************************************************************************************

17、索引库维护
【1】如果数据库数据变了,索引库里怎么同步?
package com.day;import com.day.pojo.Product;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;// 主函数入口
public class DayApplication {public static void main(String[] args) throws Exception {//createIndex();//searchIndex();//updateIndex();deleteIndex();}// 一、创建索引public static void createIndex() throws Exception {// 1.采集数据Product product_1 = new Product(1, "华为手机", 3000, 10, "华为.jpg", "华为", "300*300", 5);Product product_2 = new Product(2, "苹果手机", 8000, 30, "苹果.jpg", "苹果", "500*500", 15);List<Product> productList = new ArrayList<>();productList.add(product_1);productList.add(product_2);List<Document> documentList = new ArrayList<>(); // 文档集合// 2.创建文档对象for (Product temp : productList) {// 创建文档Document document = new Document();// 创建域对象,并且放到文档对象中document.add(new TextField("id", temp.getId() + "", Field.Store.YES));// 否 是 是(是为了查数据库)document.add(new TextField("name", temp.getName(), Field.Store.YES));// 是 是 是(因为页面需要展示商品名称)document.add(new IntPoint("price", temp.getPrice()));// 是(底层的逻辑) 是(根据范围查询) 是document.add(new StoredField("price", temp.getPrice()));// 与上面组合来完成存储document.add(new TextField("num", temp.getNum() + "", Field.Store.YES));document.add(new TextField("image", temp.getImage() + "", Field.Store.YES));document.add(new StringField("brandName", temp.getBrandName() + "", Field.Store.YES)); // 否 是 是document.add(new TextField("spec", temp.getSpec() + "", Field.Store.YES));// 放到文档集合documentList.add(document);}// 3.创建分词器Analyzer analyzer = new StandardAnalyzer();// 4.创建index目录对象,目录对象表示索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建IndexWriterConfig对象, 这个对象指定切分词使用的分词器IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);// 6.创建IndexWriter输出流对象,指定输出位置和使用的config初始化对象。IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 7.写入文档到索引库for (Document temp : documentList) {indexWriter.addDocument(temp);}// 8.释放资源indexWriter.close();}// 二、搜索public static void searchIndex() throws Exception {// 1.创建分词器(对搜索的内容进行分词使用)。如华为手机可能拆分为 华为 手机Analyzer analyzer = new StandardAnalyzer();// 注意!!!:分词器要和创建索引的时候使用的分词器一模一样(不然搜索的时候就有问题)// 2.创建查询对象  // 第一个arg默认查询域   //QueryParser queryParser = new QueryParser("name", analyzer);// 3.设置搜索关键词Query query = queryParser.parse("华为"); // queryParser.parse("id:华为手机") 指定从id查,不指定就从默认的name域查// 4.设置Directory目录对象,指定索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建输入流对象IndexReader indexReader = DirectoryReader.open(directory);// 6.创建搜索对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 7.搜索并返回结果TopDocs topDocs_10 = indexSearcher.search(query, 10);// 8.获取结果集ScoreDoc[] scoreDocArray = topDocs_10.scoreDocs;// 9.遍历结果集System.out.println("共查询到 " + scoreDocArray.length + " 条数据");if (scoreDocArray != null) {for (ScoreDoc temp : scoreDocArray) {// 获取查询到的文档唯一ID,这个ID是Lucene在创建文档的时候自动分配的。int docId = temp.doc;// 通过文档ID读取文档Document document = indexSearcher.doc(docId);System.out.println("******************************************************************************************************");System.out.println("id: " + document.get("id"));System.out.println("name: " + document.get("name"));System.out.println("price: " + document.get("price"));}}// 10. 关闭流indexReader.close();}// 三、修改索引public static void updateIndex() throws Exception {// 1.需要变更成的内容Document document = new Document();// 创建域对象,并且放到文档对象中document.add(new TextField("id", "110161", Field.Store.YES));// 否 是 是(是为了查数据库)document.add(new TextField("name", "魅族手机", Field.Store.YES));// 是 是 是(因为页面需要展示商品名称)document.add(new IntPoint("price", 1000));// 是(底层的逻辑) 是(根据范围查询) 是document.add(new StoredField("price", 1000));// 与上面组合来完成存储// 3.创建分词器Analyzer analyzer = new StandardAnalyzer();// 4.创建index目录对象,目录对象表示索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建IndexWriterConfig对象, 这个对象指定切分词使用的分词器IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);// 6.创建IndexWriter输出流对象,指定输出位置和使用的config初始化对象。IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 7.修改文档indexWriter.updateDocument(new Term("id", "1"), document);// 8.释放资源indexWriter.close();}// 四、删除索引,慎用(根据条件删除)public static void deleteIndex() throws Exception {// 3.创建分词器Analyzer analyzer = new StandardAnalyzer();// 4.创建index目录对象,目录对象表示索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建IndexWriterConfig对象, 这个对象指定切分词使用的分词器IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);// 6.创建IndexWriter输出流对象,指定输出位置和使用的config初始化对象。IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);// 7.修改文档indexWriter.deleteDocuments(new Term("id", "110161"));//indexWriter.deleteAll(); // 删除所有// 8.释放资源indexWriter.close();}
}

****************************************************************************************************************************************************************************

18、分词器
【1】搜索内容会用分词器再次切分。
【2】去掉停用词(的、是、a、an、the等)。大写转小写。
【3】分词器分为自带的和三方的分词器。
【4】比如:安徽合肥。默认分词器会分为 安 徽 合 肥。注意:分词时用的Analyzer,和搜索使用的一定要是同样的。

****************************************************************************************************************************************************************************

19、原生分词器
【1】StandardAnalyzer 对英文效果好。但是对中文就不行了,是按照字分词的。

****************************************************************************************************************************************************************************

20、空格分词器、SimpleAnalyzer
【1】根据空格分,这种对提前定义好支持的很好。仅仅去掉了空格。
【2】SimpleAnalyzer同样不支持中文分词。

****************************************************************************************************************************************************************************

23、第三方中文分词器
【1】使用中文分词器IKAnalyzer。扩展词典 指定的专有名字。停用词典 凡事出现在停用的都会被过滤掉。<!--三方分词器****************************************************************************************************************************************************--><!-- https://mvnrepository.com/artifact/com.github.magese/ik-analyzer --><dependency><groupId>com.github.magese</groupId><artifactId>ik-analyzer</artifactId><version>8.1.0</version></dependency>

IKAnalyzer.rar

****************************************************************************************************************************************************************************

24、高级查询(文本查询)
【1】文本搜索、范围搜索、组合搜索。
// 三、数据范围public static void rangeIndex() throws Exception {// 1.创建分词器(对搜索的内容进行分词使用)。如华为手机可能拆分为 华为 手机Analyzer analyzer = new IKAnalyzer();// 注意!!!:分词器要和创建索引的时候使用的分词器一模一样(不然搜索的时候就有问题)// 2.创建查询对象  // 第一个arg默认查询域   //Query query = IntPoint.newRangeQuery("price", 2500, 7999);// 4.设置Directory目录对象,指定索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建输入流对象IndexReader indexReader = DirectoryReader.open(directory);// 6.创建搜索对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 7.搜索并返回结果TopDocs topDocs_10 = indexSearcher.search(query, 10);// 8.获取结果集ScoreDoc[] scoreDocArray = topDocs_10.scoreDocs;// 9.遍历结果集System.out.println("共查询到 " + scoreDocArray.length + " 条数据");if (scoreDocArray != null) {for (ScoreDoc temp : scoreDocArray) {// 获取查询到的文档唯一ID,这个ID是Lucene在创建文档的时候自动分配的。int docId = temp.doc;// 通过文档ID读取文档Document document = indexSearcher.doc(docId);System.out.println("******************************************************************************************************");System.out.println("id: " + document.get("id"));System.out.println("name: " + document.get("name"));System.out.println("price: " + document.get("price"));}}// 10. 关闭流indexReader.close();}
【2】组合查询// 四、组合查询public static void togetherIndex() throws Exception {// 1.创建分词器(对搜索的内容进行分词使用)。如华为手机可能拆分为 华为 手机Analyzer analyzer = new IKAnalyzer();// 注意!!!:分词器要和创建索引的时候使用的分词器一模一样(不然搜索的时候就有问题)// 2.创建查询对象  // 第一个arg默认查询域   //Query query_1 = IntPoint.newRangeQuery("price", 2500, 17999);QueryParser queryParser = new QueryParser("name", analyzer);// 3.设置搜索关键词 queryParser.parse("华为 AND 手机")Query query_2 = queryParser.parse("苹果 OR 手机"); // queryParser.parse("id:华为手机") 指定从id查,不指定就从默认的name域查BooleanQuery.Builder builderQuery = new BooleanQuery.Builder();builderQuery.add(query_1, BooleanClause.Occur.MUST); // MUST = and   SHOULD= orbuilderQuery.add(query_2, BooleanClause.Occur.MUST);// 4.设置Directory目录对象,指定索引库的位置Directory directory = FSDirectory.open(Paths.get("src/main/resources/index"));// 5.创建输入流对象IndexReader indexReader = DirectoryReader.open(directory);// 6.创建搜索对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 7.搜索并返回结果TopDocs topDocs_10 = indexSearcher.search(builderQuery.build(), 10);// 8.获取结果集ScoreDoc[] scoreDocArray = topDocs_10.scoreDocs;// 9.遍历结果集System.out.println("共查询到 " + scoreDocArray.length + " 条数据");if (scoreDocArray != null) {for (ScoreDoc temp : scoreDocArray) {// 获取查询到的文档唯一ID,这个ID是Lucene在创建文档的时候自动分配的。int docId = temp.doc;// 通过文档ID读取文档Document document = indexSearcher.doc(docId);System.out.println("******************************************************************************************************");System.out.println("id: " + document.get("id"));System.out.println("name: " + document.get("name"));System.out.println("price: " + document.get("price"));}}// 10. 关闭流indexReader.close();}

****************************************************************************************************************************************************************************

26、实际案例
【1】商城页面。需求:商品名称,价格筛选等
【2】关闭springboot缓存spring.thymeleaf.cache=false
【3】不得不说thymeleaf真没有VUE好用,卧槽。

****************************************************************************************************************************************************************************

36、相关度排序
【1】词的权重。Term Frequency 出现的次数、 Document Frequency 出现的文档个数

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

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

相关文章

Redis Zset的底层原理

Redis Zset的底层原理 ZSet也就是SortedSet&#xff0c;其中每一个元素都需要指定一个score值和member值&#xff1a; 可以根据score值排序后member必须唯一可以根据member查询分数 因此&#xff0c;zset底层数据结构必须满足键值存储、键必须唯一、可排序这几个需求。之前学…

Java | Leetcode Java题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution {public int[] plusOne(int[] digits) {int n digits.length;for (int i n - 1; i > 0; --i) {if (digits[i] ! 9) {digits[i];for (int j i 1; j < n; j) {digits[j] 0;}return digits;}}// digits 中所有的元素…

LeetCode 131 —— 分割回文串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;按照 LeetCode 5——最长回文子串 中的思路&#xff0c;我们先求出 d p dp dp&#xff0c;这样我们就知道了所有的子串是否是回文子串。 然后&#xff0c;我们进行一个 dfs 搜索&#xff0c;起…

计算机网络4——网络层6路由器构成

文章目录 一、路由器的构成1、路由器结构2、交换结构 二、IP多播1、IP多播的概念2、在局域网上进行硬件多播 三、网际组管理协议IGMP和多播路由选择协议1、IP 多播需要两种协议2、网际组管理协议 IGMP3、多播路由选择协议 一、路由器的构成 1、路由器结构 路由器是一种具有多…

【Cortex-M3 CMSIS内核驱动文件详解】4:内核功能接口

文章目录 四、内核功能接口4.1 NVIC功能接口4.1.1 配置优先级分组4.1.2 获取优先级分组4.1.3 关闭使能相应的中断&#xff08;IRQ&#xff0c;非系统错误&#xff09;4.1.4 获取中断挂起&#xff08;IRQ&#xff0c;非系统错误&#xff09;4.1.5 设置外部中断挂起&#xff08;I…

一个注解完美实现分布式锁(AOP)

前言 学习过Spring的小伙伴都知道AOP的强大&#xff0c;本文将通过Redisson结合AOP&#xff0c;仅需一个注解就能实现分布式锁。 &#x1f36d; 不会使用aop和redisson的小伙伴可以参考&#xff1a; 【学习总结】使Aop实现自定义日志注解-CSDN博客 【学习总结】使用分布式锁和…

CSS 鼠标经过放大元素 不影响其他元素

效果 .item:hover{transform: scale(1.1); /* 鼠标悬停时将元素放大 1.1 倍 */ }.item{transition: transform 0.3s ease; /* 添加过渡效果&#xff0c;使过渡更加平滑 */ }

【研发日记】Matlab/Simulink避坑指南(十一)——Delay周期Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(六)——字节分割Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指…

MMDetection目标检测框架推理与参数量计算

模型推理 在使用MMDetection框架完成训练后便可以使用训练所得的权重文件进行推理了&#xff0c;具体可以使用MMDetection文件下的demo文件夹的image_demo.py文件。 from argparse import ArgumentParser from mmengine.logging import print_log from mmdet.apis import Det…

CSS-IN-JS Emotion

为什么会有css-in-js 优点 缺点 使用emotion插件库 npm i emotion/core emotion/styled使用时需要解析css属性 使用方式一&#xff1a; 通过注释告诉babel不讲jsx转化为react.create Element的调用&#xff0c;而是转化为jsx语法。会导致一个警告react未使用。 使用方式二&am…

Redis__三大日志

文章目录 &#x1f60a; 作者&#xff1a;Lion J &#x1f496; 主页&#xff1a; https://blog.csdn.net/weixin_69252724 &#x1f389; 主题&#xff1a;Redis__三大日志 ⏱️ 创作时间&#xff1a;2024年04月30日 ———————————————— 对于MySQL来说, 有…

ShellScript脚本编程(一)

什么是Shell Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务 为什么…

Themis新篇章:老牌衍生品协议登陆Blast L2,探索全新经济模型

本文将深入分析 Themis 的最新经济模型&#xff0c;探讨其核心概念和机制、优势与创新之处、风险与挑战。 一、引言 随着区块链技术的不断发展&#xff0c;DeFi 衍生品项目逐渐成为市场的焦点。而用户体验的革新&#xff0c;进一步的金融创新&#xff0c;去中心化治理方案的优…

SpringCloud整合Gateway结合Nacos

目录 一、引入依赖 二、开启两个测试项目 2.1 order service ​编辑 2.2 user service 三、gateway项目 3.1 新建一个bootstrap.yml文件 3.2 将我们的的网关配置写道nacos里的配置里 3.3 测试&#xff1a;看能够根据网关路由到两个测试的项目 四、 优化 4.1 将项目打包…

字节跳动发起AI战争 寻找下一个TikTok

现如今在字节跳动&#xff0c;已近乎隐退的张一鸣&#xff0c;只重点关注两件事&#xff1a;其一&#xff0c;是风暴中的TikTok&#xff1b;其二&#xff0c;就是字节跳动正在全力追赶的AI战略业务。 提及字节的AI战略远望,多个接近字节的人士均认为,以Flow部门出品最为“正统…

pthread线程相关

LWP :轻量级 进程&#xff0c;本质仍是进程 进程 &#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的TCB&#xff0c;但没有独立的地址空间&#xff08;共享&#xff09; 区别 &#xff1a;在与是否共享地址文件 进程 &#xff08;独居&#xff09;&am…

数据结构:最小生成树(Prim算法和Kruskal算法)、图的最短路径(Dijkstra算法和Bellman-Ford算法)

什么是最小生成树&#xff1f;Prim算法和Kruskal算法是如何找到最小生成树的&#xff1f; 最小生成树是指在一个连通图中&#xff0c;通过连接所有节点并使得总权重最小的子图。 Prim算法和Kruskal算法是两种常用的算法&#xff0c;用于寻找最小生成树。 Prim算法的步骤如下&…

文件API及其操作

这里介绍两类文件操作、三个文件类。包括文件系统操作&#xff08;File类&#xff09;、文件内容操作&#xff08;操作字节流、操作字符流&#xff09; 1.文件类File 1.1.认识File类 &#xff08;1&#xff09;什么是File类呢&#xff1f;其实就是可以操作文件的一个类。通过…

C# dateTimePicker控件存取数据库问题

存入数据库时&#xff0c;先设置&#xff0c; dateTimePicker1.Format DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat "yyyy-MM-dd HH:mm:ss"; 然后&#xff0c;dateTimePicker1.Text 就和textBox1.Text一样方式存入数据库&#xff1b;…

【Java EE】Mybatis之XML详解

文章目录 &#x1f38d;配置数据库连接和MyBatis&#x1f340;写持久层代码&#x1f338;添加mapper接口&#x1f338;添加UserInfoXMLMapper.xml&#x1f338;单元测试 &#x1f332;CRUD&#x1f338;增(Insert)&#x1f338;删(Delete)&#x1f338;改(Update)&#x1f338;…