lucene_Lucene组件概述

lucene

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。

在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以提供强大的搜索功能。 在这里查看 !

目录

1.信息超载/爆炸 2.索引非结构化数据的组件 3.数据搜索的组成部分 4.使用Apache Lucene的简单搜索应用程序 5.下载源代码

1.信息超载/爆炸

如今,应用程序中的搜索功能正变得越来越重要。 毕竟,Web仅仅与信息有关,而所有与在正确的时间和正确的手中获取信息有关。

信息爆炸的形式是,现代世界中已发布的数字信息量Swift增加,以及大量原始数据和非结构化数据的影响。 这种信息爆炸导致我们所有人的信息过载持续不断。

现在,信息超载已成为世界各地办公室中的普遍现象。 一些原因包括:

  1. 广泛访问网络
  2. 向大量人发送电子邮件的简便性
  3. 由于可以免费复制信息,因此制作更多副本不会产生可变成本–人们将报告和信息发送给可能需要知道而不是绝对需要知道的人。
  4. 信息源创建不当(尤其是在线),这些信息源:
    • 没有简化或过滤以使其更短
    • 书写不清晰,所以人们不得不花更多的时间来理解它们
    • 包含事实错误或不一致之处-需要进一步研究

尽管没有上述问题的简单且单一的解决方案,但是可以使用一些方法来缓解该问题。

这些包括:

  1. 花更少的时间来获取“很想知道”的信息,而将更多的时间花在我们“现在需要知道”的事情上。
  2. 关注信息的质量,而不是数量。 简短的电子邮件比冗长的电子邮件更有价值。
  3. 学习如何创建更好的信息。 直截了当地询问我们的问题,以便他们提供准确的答案。
  4. 单任务处理,使头脑一次专注于一个问题。

现在,除此以外,我们还可以使用开源搜索库Apache Lucene实施信息检索解决方案,只要我们可以从内容存储库中获取文本数据,它就可以从此类非结构化内容中检索信息。

搜索应用程序的简短概述

  1. 将文件存储在文件系统中。
  2. 在存储文件时,我们需要在Lucene索引中将文件添加为文档。
  3. 在删除文件时,我们需要从相应的Lucene索引中删除文件的条目。
  4. 使用Lucene标准分析器分析文档(我们可以使用其他可插入Lucene的分析器)
  5. 使用额外的字段(例如文档中的文件路径)更新Lucene索引。
  6. 从Lucene标准分析开始搜索
  7. 与针对数百万个文档的关系数据库搜索相比,我们可以以大大提高的速度获得此类搜索的结果。
  8. 现在,如果我们在Lucene索引存储库中的文件系统中具有该文件的链接,就可以对其进行浏览-这可能是我们的应用目标之一。

当然,以上用例并不是从庞大的信息存储库中所有基于文本的搜索和信息检索的唯一解决方案。 在某些情况下,普通的数据库搜索功能就足够了。 其他工具(例如Apache Hadoop)对数据处理的要求也是可行的选择。

2.索引非结构化数据的组件

索引组件维护文件的目录,这些目录可供用户检索文件。 索引组件是一项可选功能,应安装在用户可以访问以进行文件检索的任何服务器上。 索引组件支持按文件,文件版本和近期活动进行搜索。

让我们研究与Lucene Indexing相关的一些术语:

索引实体

存储在Lucene索引存储库中的那些文件或信息称为索引实体。

每个Lucene索引由一个由名称唯一标识的索引管理器管理。 在大多数情况下,索引实体和单个IndexManager之间也存在一对一关系(管理索引)。 索引分片和索引共享的用例除外。 当单个实体的索引太大而索引操作使应用程序变慢时,可以应用前者。 在这种情况下,单个实体被索引为多个索引,每个索引都有自己的索引管理器。 后者是索引共享,是将多个实体索引到同一Lucene索引中的功能。

分片索引

在某些情况下,将给定实体的索引数据拆分(分片)为多个Lucene索引可能很有用。

分片的可能用例是:

  1. 单个索引是如此之大,以至于索引更新时间使应用程序变慢。
  2. 典型的搜索只会命中索引的子集,例如当数据按客户,地区或应用程序自然细分时。

共享索引

从技术上讲,可以将多个实体的信息存储到单个Lucene索引中。 有两种方法可以实现此目的:

  1. 配置基础目录提供程序以指向相同的物理索引目录。 对于家具和动物实体,我们应该使用相同的索引(目录)。 我们只是将两个实体的indexName设置为“ Animal”。 然后,两个实体都将存储在Animal目录中。
  2. 将要合并的实体的@Indexed批注的index属性设置为相同的值。 如果我们再次希望所有的Furniture实例以及所有的Animal实例都在Animal索引中被索引,我们将在Animal和Furniture类上都指定@Indexed(index="Animal")

3.数据搜索的组成部分

核心索引类

Lucene能够获得快速的搜索响应,因为它不是直接搜索文本,而是搜索索引。 这相当于通过搜索书后的索引来检索与关键字相关的书中的页面,而不是在书的每一页中搜索单词。

这种类型的索引称为反向索引,因为它会将以页面为中心的数据结构(page-> words)转换为以关键字为中心的数据结构(word-> pages)。

我们可以相应地整理核心索引类,

  1. 索引作家
  2. 目录
  3. 分析仪
  4. 文件
  5. 领域

要创建索引,首先要做的是创建一个IndexWriter对象。 IndexWriter对象用于创建索引并向该索引添加新的索引条目(即Documents)。 您可以创建一个IndexWriter ,如下所示:

IndexWriter indexWriter = new IndexWriter("index-directory", new StandardAnalyzer(), true);

第一个参数指定将在其中创建Lucene索引的目录,在本例中为index-directory。 第二个参数指定在Lucene为您的数据建立索引时将使用的“文档解析器”或“文档分析器”。 在这里,我们为此使用StandardAnalyzer 。 有关Lucene分析仪的更多详细信息将很快出现。 第三个参数告诉Lucene如果尚未在目录中创建索引,则创建一个新索引。

文档是索引和搜索过程的单位。

字段是Lucene的实际内容所有者。 它们基本上是一个具有名称和值的哈希表。

IndexWriter创建并维护索引。

构造函数的create参数确定是创建新索引还是打开现有索引。 即使读者正在使用索引,我们也可以使用“ create = true”打开索引。 旧的读者将继续搜索他们已打开的“时间点”快照,直到重新打开后才能看到新创建的索引。 还有一些没有create参数的构造函数,如果提供的路径上没有索引,则会创建新索引,否则将打开现有索引。

自上次刷新以来(以较早者为准),在上述方法调用过程中所做的更改将存储在内存中,并在有足够的缓冲删除或添加的文档时触发刷新。 冲洗也可以被强制调用。 进行刷新时,未完成的删除和添加的文档都将刷新到索引。 刷新也可能触发一个或多个段合并。

构造函数的可选autoCommit参数控制对读取相同索引的IndexReader实例IndexReader更改的可见性。 如果为false,则在调用close()之前看不到更改。 更改仍将作为新文件刷新到目录中,但不会被提交(不会写入新的segment_N文件引用新文件),直到调用close()为止。 如果在close() )之前发生了严重错误(例如JVM崩溃),则索引将不反映所做的任何更改(它将保持其初始状态)。 我们还可以调用abort() ,它在不进行任何更改的情况下关闭编写器,并删除所有已刷新但现在未引用的索引文件。 此模式对于防止读者在不好的时间刷新(例如在完成所有删除之后但在完成添加之前)很有用。 它也可以用于实现简单的单作者事务性语义(“全部或全部”)。

autoCommit为true时,则每次刷新也是一次提交。 在这种模式下运行时,应记住一件事,即在进行优化或段合并时,读者不应刷新,因为这会占用大量磁盘空间。

无论autoCommit如何, IndexReaderIndexSearcher只会在打开索引的“时间点”看到该索引。 打开阅读器后,提交给索引的任何更改将不可见,直到重新打开阅读器为止。

如果在一段时间内不再添加更多文档,并且需要最佳搜索性能,则应在关闭索引之前调用优化方法。

打开IndexWriter会为使用中的目录创建一个锁定文件。 尝试在同一目录上打开另一个IndexWriter将导致LockObtainFailedException 。 如果使用同一目录上的IndexReader从索引中删除文档,也会引发LockObtainFailedException

核心搜索课程

核心搜索类是:

  1. IndexSearcher
  2. 术语
  3. 询问
  4. 术语查询
  5. 顶级文档

Lucene使用恰当命名的IndexReader实例从索引中读取数据。

Lucene提供了执行实际搜索的IndexSearcher类。 每个索引搜索器都会包装一个索引读取器,以获取索引数据的句柄。 有了索引搜索器后,我们可以为其提供查询并按得分顺序枚举结果。 除了索引阅读器之外,在索引搜索器中实际上没有什么可配置的。

IndexSearcher实例是完全线程安全的,这意味着多个线程可以同时调用其任何方法。 如果应用程序需要外部同步,则无需在IndexSearcher实例上进行同步。 我们可以使用我们自己的(非Lucene)对象。

这是IndexReader类的语法:

IndexSearcher is = new IndexSearcher(path);

查询分为术语和运算符。 术语有两种:单项和短语。

单个术语是一个单词,例如“ test”或“ hello”。

词组是由双引号括起来的一组单词,例如“ hello User”。

可以将多个术语与布尔运算符组合在一起以形成更复杂的查询。

Lucene支持字段数据,Search Lucene API模块经常在分面搜索中使用这些数据。 默认情况下,Search Lucene API搜索内容字段。 但是,您可以通过键入字段名称后跟冒号“:”和我们要查找的术语来搜索特定字段中的数据。

例如,如果我们搜索名为“ The Right Way”的节点,其中包含文本“ go”,则可以输入:

title:"The Right Way" AND contents:go

要么

title:"The Right Way" AND go

由于内容是默认字段,因此不需要字段指示符。

该字段仅对其直接在前的术语有效,因此查询

title:Right Way

只会在标题字段中找到“右”。 它将尝试在默认字段(本例中为内容字段)中查找“ way”。

下面列出了所有可用的字段类型,

  1. 未储存
  2. 关键词
  3. 未索引
  4. 文本
  5. 二元

TopDocs是文档的集合,这些文档在使用查询字符串进行搜索后进行了排序。 最匹配的文档在TopDocs顶部列出。

对于搜索操作,需要一个IndexSearcher类,该类实现了主要的搜索方法。 对于每次搜索,都需要一个新的Query对象,并且可以从QueryParser实例中获得该对象。 请注意,必须使用与创建索引相同的分析器类型来创建QueryParser ,在本例中为SimpleAnalyzer 。 根据JavaDocs的说法,Version也用作构造函数参数,并且是一个“被某些类用来在Lucene的各个发行版之间匹配版本兼容性”的类。

当由IndexSearcher执行搜索时,将作为执行结果返回TopDocs对象。 此类仅表示搜索结果,并允许我们检索ScoreDoc对象。 使用ScoreDocs我们找到符合搜索条件的文档,然后从这些文档中检索所需的信息。 让我们看看所有这些都在起作用。

4.使用Apache Lucene的简单搜索应用程序

在开始我们的第一个搜索应用程序之前,我们必须下载最新版本的Lucene。

我们已经下载了4.6版的Lucene jar文件。

接下来,我们必须构建一个名为“ LuceneWink”的项目,并将jar文件添加到该项目的类路径中。

在开始运行搜索查询之前,我们需要构建一个索引,将针对该索引执行查询。 这将在名为IndexWriter的类的帮助下完成,该类是创建和维护索引的类。 IndexWriter接收文档作为输入,其中文档是索引和搜索的单位。 每个Document实际上是一组字段,并且每个字段都有一个名称和一个文本值。 要创建IndexWriter ,需要一个分析器。 此类是抽象的,我们将使用的具体实现是SimpleAnalyzer

我们将尝试找出包含将在以下应用程序中作为查询提供的字符串的文件。

因此,我们必须建立文件索引并对其进行搜索,然后在其中进行搜索操作。

这是示例程序,注释以内联方式给出:

package com.wf.lucene;import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
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.TopScoreDocCollector;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;public class LuceneOnFileSystemExample {static String DATA_FOLDER = "/home/piyas/Documents/Winkframe/sample_text_files/drugs/"; // Where the files are.static String INDEX_FOLDER = "/home/piyas/Documents/Winkframe/sample_text_files/drugindex/"; // Where the Index files are.private static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);private static IndexWriter writer;private static ArrayList<File> queue = new ArrayList<File>();public static void indexFilesAndShowResults(String dataFilePath,String indexFilePath,String searchTerm) throws Exception {// Indexing partindexOnThisPath(indexFilePath); // Function for setting the Index PathindexFileOrDirectory(dataFilePath); // Indexing the filescloseIndex(); //Function for closing the files// Search PartsearchInIndexAndShowResult(indexFilePath, searchTerm);}public static void searchInIndexAndShowResult(String indexFilePath,String searchString) throws Exception{IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexFilePath))); // The api call to read the indexIndexSearcher searcher = new IndexSearcher(reader); // The Index Searcher ComponentTopScoreDocCollector collector = TopScoreDocCollector.create(5, true);Query q = new QueryParser(Version.LUCENE_46, "contents", analyzer).parse(searchString);searcher.search(q, collector);ScoreDoc[] hits = collector.topDocs().scoreDocs;// display resultsSystem.out.println("Found " + hits.length + " hits.");for(int i=0;i<hits.length;++i) {int docId = hits[i].doc;Document d = searcher.doc(docId);System.out.println((i + 1) + ". " + d.get("path") + " score=" + hits[i].score); // Found the document}}public static void closeIndex() throws Exception {writer.close(); // Close the Index}public static void indexOnThisPath(String indexDir) throws Exception {// the boolean true parameter means to create a new index everytime,// potentially overwriting any existing files there.FSDirectory dir = FSDirectory.open(new File(indexDir));IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);writer = new IndexWriter(dir, config);}/*** Indexes a file or directory* @param fileName the name of a text file or a folder we wish to add to the index* @throws java.io.IOException when exception*/public static void indexFileOrDirectory(String filePath) throws Exception {// Adding the files in lucene index//===================================================//gets the list of files in a folder (if user has submitted//the name of a folder)//===================================================addFiles(new File(filePath));int originalNumDocs = writer.numDocs();for (File f : queue) {FileReader fr = null;try {Document doc = new Document();//===================================================// add contents of file//===================================================fr = new FileReader(f);doc.add(new TextField("contents", fr));doc.add(new StringField("path", f.getPath(), Field.Store.YES));doc.add(new StringField("filename", f.getName(), Field.Store.YES));writer.addDocument(doc);System.out.println("Added: " + f);} catch (Exception e) {System.out.println("Could not add: " + f);} finally {fr.close();}}int newNumDocs = writer.numDocs();System.out.println("");System.out.println("************************");System.out.println((newNumDocs - originalNumDocs) + " documents added.");System.out.println("************************");queue.clear();}private static void addFiles(File file) {if (!file.exists()) {System.out.println(file + " does not exist.");}if (file.isDirectory()) {for (File f : file.listFiles()) {addFiles(f);}} else {String filename = file.getName().toLowerCase();//===================================================// Only index text files//===================================================if (filename.endsWith(".htm") || filename.endsWith(".html") ||filename.endsWith(".xml") || filename.endsWith(".txt")) {queue.add(file);} else {System.out.println("Skipped " + filename);}}}/*** @param args*/public static void main(String[] args)  {// TODO Auto-generated method stubtry{indexFilesAndShowResults(DATA_FOLDER,INDEX_FOLDER,"HIV"); // Indexing files and Searching the word from files.}catch(Exception e){e.printStackTrace();}}}

本文随附了示例应用程序。

我们提供索引目录,搜索查询字符串和最大匹配数,然后调用searchIndex方法。 在该方法中,我们创建一个IndexSearcherQueryParser和Query对象。 请注意, QueryParser使用了我们用于使用IndexWriter创建文档的字段的名称(“内容”),并且再次使用了相同类型的分析器( SimpleAnalyzer )。 我们执行搜索,并为找到匹配项的每个Document提取包含文件名(“ filename”)的字段的值,然后进行打印。

在这里,我们使用Apache Lucene创建了一个简单的搜索应用程序。 在下一篇文章中,我们将使用更高级的查询以及Lucene索引和搜索的其他高级选项。

5.下载源代码

您可以下载源代码, 在这里和数据归档在这里 。

翻译自: https://www.javacodegeeks.com/2015/09/lucene-components-overview.html

lucene

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

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

相关文章

为什么永远不会有语言取代 C/C++?

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络数以百计的 C/C 替代品将会出现&#xff0c;但 C/C 将永远与我们同在&#xff01;每个 CPU 都带有一种称为 ISA&#xff08;指…

qt 表格中插入一行_在EXCEL表格中,快速插入多行、多列的技巧

在使用Excel过程中&#xff0c;我们会遇到需要插入相同格式的多行或多列&#xff0c;如果一行行或一列列的插入&#xff0c;对于插入的数量较少的情况还是适用的。可是如果需要插入上百的行或列&#xff0c;使用此方法就比较费时费力啦。分享几个小技巧实现快速插入多行或多列.…

amber 口译_口译员设计模式示例

amber 口译本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff…

别再自己瞎写工具类了,SpringBoot内置工具类应有尽有,建议收藏!!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络断言断言是一个逻辑判断&#xff0c;用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入&#xff0c;可通过 JVM 参数-en…

ad转换器工作原理_AD转换中参考电压的作用

AD转换AD转换就是模数转换。顾名思义&#xff0c;就是把模拟信号转换成数字信号。主要包括积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型、电容阵列逐次比较型及压频变换型。A/D转换器是用来通过一定的电路将模拟量转变为数字量。模拟量可以是电压、电流等电信号&…

面试大全 | C语言高级部分总结

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络一、内存大话题1.0、内存就是程序的立足之地&#xff0c;体现内存重要性。1.1、内存理解&#xff1a;内存物理看是有很多个Ban…

ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习

maven介绍Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来运…

戴尔集群监控与管理系统_监控与管理

戴尔集群监控与管理系统本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0…

三位数除以两位数竖式计算没有余数_苏教四上期末复习——两、三位数除以两位数...

期末复习读万卷书 &#xff1c;做一好题第二单元两、三位数除以两位数计算能力1、竖式计算5106740961700262914246829810132、简便方法计算150253810(92)560353、填空720秒( )分300分( )时336时( )日调商1、小李计算一道除法是两位数的除法算式&#xff0c;商是12&#x…

单例模式示例_单例设计模式示例

单例模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

解读C++即将迎来的重大更新(一):C++20的四大新特性

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络C20&#xff08;C 编程语言标准 2020 版&#xff09;将是 C 语言一次非常重大的更新&#xff0c;将为这门语言引入大量新特性。…

小尼机器人_小尼被机器人嫌弃“唱歌难听,长相一般”?

我们如今所处的时代&#xff0c;科技创新的速度日新月异,生活方式多彩多姿。人人都说&#xff1a;科技改变了生活。今晚《开门大吉》也迎来了三大改变生活的神奇黑科技&#xff01;智能且生态的“移动城堡”在网上预定好酒店以后&#xff0c;到了现场没有前台和服务员&#xff…

产品原型示例_原型设计模式示例

产品原型示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

13 年,MySQL 之父赌赢了:另起炉灶的 MariaDB 成功上市!

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;今年 2 月&#xff0c;开源数据库厂商 MariaDB 完成了 1.04 亿美元的 D 轮融资&#xff0c;同…

太阳粒子是什么东西_太阳光子前世今生告诉我们现在享受之阳光是十几万年前诞生的老光...

我们都知道天晴时阳光明媚&#xff0c;但这个阳光是怎么来的呢&#xff0c;很多人就不一定清楚了。在这里我们首先来了解几个概念&#xff1a;光子、光、电磁波、电磁辐射。光子是传递电磁波相互作用的基本粒子&#xff0c;是一种规范波色子&#xff0c;是电磁辐射的载体&#…

java 观察者模式示例_观察者设计模式示例

java 观察者模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 …

推荐一些小而美的互联网公司

关注星标&#xff0c;每天学习C语言新技能因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源&#xff1a;网络&#xff0c;侵权删&#xff01;这两年互联网大厂都在频繁裁员&#xff0c;今天汇总了一些网友们推荐的小而美企业供大家参考&…

int类型存小数 mysql_MySQL基本数据类型

1&#xff09;整形1.介绍分类&#xff1a;tinyint , smallint , mediumint , int , bigint 应用场景&#xff1a;存储年龄&#xff0c;等级&#xff0c;id&#xff0c;各种号码等典型存储范围介绍:https://images2017.cnblogs.com/blog/1036857/201708/1036857-201708011814337…

枚举重名_举重设计模式示例

枚举重名本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01…

data在python_python-data-英语单词

In this video well be talking about data analysis and the scenario in which well be playing the data analyst or data scientist.在这个视频里&#xff0c;我们将讨论数据分析和用脚本语言分析数据或成为数据科学家Data analysis and, in essence, data science, helps …