建立索引lucene_用Lucene建立搜索索引

建立索引lucene

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

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

目录

1.简介 2.了解索引操作
2.1倒排索引 2.2字段类型 2.3细分 2.4文件编号 2.5搜索索引
3.创建索引 4.基本索引操作
4.1核心索引类 4.2将数据添加到索引
5.文件和领域
5.1文件 5.2领域 5.3在Lucene中增强文档

1.简介

该索引是利用Lucene的任何组件的核心。 就像书籍的索引一样,它组织所有数据,以便可以快速访问。 索引由包含一个或多个字段的文档组成。 “文档和字段”可以代表我们选择的任何内容,但一个常见的隐喻是“文档”代表数据库表中的条目,而“字段”类似于表中的字段。

2.了解索引操作

让我们看一下Lucene搜索索引的图形表示。

图1

图1

简而言之,当Lucene对文档进行索引时,它会将其分解为许多术语。 然后,它将术语存储在索引文件中,其中每个术语都与包含该术语的文档相关联。 我们可以把它当作一个哈希表。 术语是使用分析器生成的,该分析器将每个单词的词根都提取出来。 发出查询时,将通过用于构建索引的同一分析器来处理该查询,然后使用该分析器在索引中查找匹配项。 这提供了与查询匹配的文档列表。

现在,让我们看一下整个Lucene搜索过程。

基本概念是索引,文档,字段和术语。

  1. 索引包含文档的集合。
  2. 文档是字段的集合。
  3. 字段是术语的集合。
  4. 术语是成对的字符串<field,term-string>。

2.1倒排索引

索引存储有关术语的统计信息,以使基于术语的搜索更加高效。 Lucene的索引属于称为反向索引的索引族。 这是因为它可以长期列出包含它的文档。 这与自然关系相反,在自然关系中文档列出了术语。

2.2字段类型

在Lucene中,可以存储字段,在这种情况下,它们的文本按原样以非反转的方式存储在索引中。 反转的字段称为索引。 字段可以被存储和被索引。

可以将字段的文本标记为要索引的术语,或者可以将字段的文本从字面上用作要索引的术语。 大多数字段都是标记化的,但有时对于某些标识符字段按字面意义进行索引很有用。

2.3细分

Lucene索引可以由多个子索引或段组成。 每个段都是完全独立的索引,可以分别进行搜索。 索引按以下方式演变:

  1. 为新添加的文档创建新的细分。
  2. 合并现有细分。
  3. 搜索可能涉及多个段和/或多个索引,每个索引可能由一组段组成。

2.4文件编号

在内部,Lucene通过整数文档号引用文档。 添加到索引的第一个文档编号为零,并且随后添加的每个文档的编号都比前一个大。

请注意,文档编号可能会更改,因此在将这些编号存储在Lucene之外时应格外小心。 特别是在以下情况下,数字可能会更改:

存储在每个段中的数字仅在该段内是唯一的,并且必须进行转换才能在更大的上下文中使用它们。 标准技术是根据该段中使用的数字范围为每个段分配一个值范围。 要将文档编号从段转换为外部值,需要添加段的基本文档编号。 要将外部值转换回特定于细分的值,可以通过外部值所在的范围来标识细分,然后减去细分的基值。 例如,可以合并两个五个文档的段,以便第一个段的基值为零,第二个为五个。 第二段中的文档3的外部值为8。

删除文档后,在编号中会留出空白。 随着索引通过合并的发展,这些最终被删除。 合并段时删除已删除的文档。 因此,新合并的段在编号上没有空白。

2.5搜索索引

搜索索引由javascript函数定义。 它以类似于视图的地图功能的方式运行在所有文档上,并定义了搜索可查询的字段。 搜索索引是数据库的一种变体。 它与RDBMS相似,因为它需要快速查找密钥,但是大部分数据驻留在辅助存储上。

3.创建索引

到目前为止,我们已经看到了Lucene索引的所有组成部分。 在本节中,我们将使用Lucene索引创建文档索引。

考虑一个学生在其中提交年度杂志文章的项目。 输入控制台包含用于学生姓名,文章标题,文章类别和文章正文的选项。 我们假设该项目正在网络中运行并且可以通过它进行访问。 要为这篇文章建立索引,我们将需要文章本身,作者姓名,撰写日期,文章主题,文章标题以及文件所在的URL。 利用这些信息,我们可以构建一个程序,该程序可以正确索引文章以使其易于查找。

让我们看一下我们类的基本框架,包括我们将需要的所有导入。

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits; import java.util.Date; public class ArticleIndexer { }

我们需要添加的第一件事是将文章转换为Document对象的方法。

为此,我们将使用方法createDocument()

private Document createDocument(String article, String author,String title, String topic,String url, Date dateWritten) { Document document = new Document();document.add(Field.Text("author", author));document.add(Field.Text("title", title));document.add(Field.Text("topic", topic));document.add(Field.UnIndexed("url", url));document.add(Field.Keyword("date", dateWritten));document.add(Field.UnStored("article", article));return document;}

首先,我们创建一个新的Document对象。 我们需要做的下一步是将文章的不同部分添加到Document 。 我们为每个部分提供的名称完全是任意的,并且像HashMap键一样工作。 使用的名称必须是String 。 Document的add方法将采用一个Field对象,该对象是使用Field类提供的静态方法之一构建的。 提供了四种将Field对象添加到Document的方法。

Field.Keyword –数据已存储并建立索引,但未标记化。 这对于应保留不变的数据(例如日期)最有用。 实际上,Field.Keyword可以将Date对象作为输入。

Field.Text –数据被存储,索引和标记化。 Field.Text字段不应用于诸如文章本身之类的大量数据,因为索引将变得非常大,因为它将包含文章的完整副本以及标记化的版本。

Field.UnStored –不存储数据,但对其进行索引和标记化。 大量的数据(如文章的文本)应放置在未存储的索引中。

Field.UnIndexed –数据已存储但未建立索引或标记化。 它与要与搜索结果一起返回的数据一起使用,但实际上不会在该数据上进行搜索。 在我们的示例中,由于我们不允许搜索URL,因此没有理由对其进行索引,但是我们希望在找到搜索结果后将其返回给我们。

现在我们有了一个Document对象,我们需要获得一个IndexWriter来将此Document写入索引。

String indexDirectory = "lucene-index"; private void indexDocument(Document document) throws Exception {Analyzer analyzer  = new StandardAnalyzer();IndexWriter writer = new IndexWriter(indexDirectory, analyzer, false);writer.addDocument(document);writer.optimize();writer.close();}

我们首先创建一个StandardAnalyzer ,然后使用分析器创建一个IndexWriter 。 在构造函数中,我们必须指定索引将驻留的目录。 构造函数末尾的布尔值告诉IndexWriter是创建新索引还是添加到现有索引。 在将新文档添加到现有索引时,我们将指定false。 然后,我们将Document添加到索引。 最后,我们优化然后关闭索引。 如果要添加多个Document对象,则应始终进行优化,然后在将所有Document对象都添加到索引之后关闭索引。

现在,我们只需要添加一种将各个部分组合在一起的方法即可。

为了驱动索引​​操作,我们将编写一个indexArticle()一些参数的方法indexArticle()

public void indexArticle(String article, String author,String title, String topic,String url, Date dateWritten)throws Exception {Document document = createDocument(article, author,title, topic,url, dateWritten);indexDocument(document);}

对文章运行此操作会将该文章添加到索引中。 将IndexWriter构造函数中的布尔值更改为true会创建一个索引,因此我们应该在第一次创建索引以及每次要从头开始重建索引时使用它。 现在我们已经构建了索引,我们需要在索引中搜索文章。

索引存储为单个目录中的一组文件。

索引由任意数量的独立段组成,这些段存储有关已索引文档子集的信息。 每个段都有自己的术语词典,术语词典索引和文档存储(存储的字段值)。 所有段数据都存储在_xxxxx.cfs文件中,其中xxxxx是段名称。

创建索引段文件后,将无法对其进行更新。 新文档将添加到新段中。 删除的文档仅在可选的.del文件中标记为已删除。

4.基本索引操作

索引数据

Lucene让我们可以以文本格式索引任何可用数据。 Lucene可以用于几乎所有数据源,只要可以从中提取文本信息即可。 我们可以使用Lucene索引和搜索存储在HTML文档,Microsoft Word文档,PDF文件等中的数据。 索引数据的第一步是使其以简单文本格式可用。 可以使用自定义解析器和数据转换器。

索引过程

索引编制是将文本数据转换为便于快速搜索的格式的过程。 一个简单的类比是您在书末找到的索引:该索引将您指向书中出现的主题的位置。

Lucene将输入数据存储在称为反向索引的数据结构中,该结构作为一组索引文件存储在文件系统或内存中。 大多数Web搜索引擎使用反向索引。 它使用户可以执行快速的关键字查找,并找到与给定查询匹配的文档。 在将文本数据添加到索引之前,它需要由分析器处理(使用分析过程)。

分析

分析将文本数据转换为基本搜索单位,称为术语。 在分析过程中,文本数据将经历多个操作:提取单词,删除常用单词,忽略标点符号,将单词简化为根形式,将单词更改为小写字母等。分析仅在建立索引和查询解析之前进行。 分析将文本数据转换为标记,并将这些标记作为术语添加到Lucene索引中。

Lucene带有各种内置分析器,例如SimpleAnalyzerStandardAnalyzerStopAnalyzerSnowballAnalyzer等。 这些不同之处在于它们标记文本和应用过滤器的方式。 由于分析会在建立索引之前删除单词,因此会减小索引大小,但会对查询处理的精度产生负面影响。 您可以使用Lucene提供的基本构建块来创建自定义分析器,从而对分析过程进行更多控制。 表1显示了一些内置分析仪及其处理数据的方式。

4.1核心索引类

目录

表示索引文件存储位置的抽象类。 通常主要使用两个子类:

FSDirectory —目录的实现,在实际的文件系统中存储索引。 这对于大索引很有用。

RAMDirectory —将所有索引存储在内存中的实现。 这适用于较小的索引,这些索引可以完全加载到内存中,并在应用程序终止时销毁。 由于索引保存在内存中,因此速度相对较快。

分析仪

如上所述,分析器负责预处理文本数据并将其转换为存储在索引中的令牌。 IndexWriter接受用于对数据建立索引之前对其进行标记化的分析器。 要正确索引文本,您应该使用适合需要索引的文本语言的分析器。

默认分析器适用于英语。 Lucene沙箱中还有其他几种分析器,包括中文,日文和韩文的分析器。

IndexDeletionPolicy

用于实现自定义从索引目录中删除过时提交的策略的接口。 默认的删除策略是KeepOnlyLastCommitDeletionPolicy ,该策略仅保留最新的提交,并在完成新提交后立即删除所有先前的提交。

索引作家

创建或维护索引的类。 它的构造函数接受一个布尔值,该布尔值确定是创建新索引还是打开现有索引。 它提供了添加,删除或更新索引中文档的方法。

最初对索引所做的更改将存储在内存中,并定期刷新到索引目录中。 IndexWriter公开了几个字段,这些字段控制索引在内存中的缓冲方式以及如何将其写入磁盘。 除非调用IndexWriter的commit或close方法,否则对IndexReader不到对索引所做的更改。 IndexWriter为目录创建一个锁定文件,以防止索引同时更新导致索引损坏。 IndexWriter允许用户指定可选的索引删除策略。

4.2将数据添加到索引

将文本数据添加到索引涉及两个类。

字段表示在搜索中查询或检索的一条数据。 Field类封装一个字段名称及其值。 Lucene提供了一些选项来指定是否需要对字段进行索引或分析以及是否需要存储其值。 在创建字段实例时可以传递这些选项。 下表显示了字段元数据选项的详细信息。

选项 描述
Field.Store.Yes 用于存储字段的值。 适用于显示搜索结果的字段,例如文件路径和URL。
Field.Store.No 字段值未存储-例如,电子邮件正文。
Field.Index.No 适用于未搜索的字段-通常与存储的字段一起使用,例如文件路径。
Field.Index.ANALYZED 用于索引但未分析的字段。 它完整​​保留了字段的原始值,例如日期和个人名称。
Field.Index.NOT_ANALYZED 用于索引但未分析的字段。 它完整​​保留了字段的原始值,例如日期和个人名称。

字段元数据选项的详细信息

而文档是字段的集合。 Lucene还支持增强文档和字段,如果要重视某些索引数据,这是一个有用的功能。 为文本文件建立索引包括将文本数据包装在字段中,创建文档,使用字段填充文本,以及使用IndexWriter将文档添加到索引中。

5.文件和领域

如您先前所见,文档是索引和搜索过程的单元。

5.1文件

文档是一组字段。 每个字段都有一个名称和一个文本值。 字段可以与文档一起存储,在这种情况下,它会随文档的搜索命中一起返回。 因此,每个文档通常应包含一个或多个唯一标识它的存储字段。

您将文档添加到索引,并且在执行搜索之后,您将获得结果列表,它们是文档。 文档只是字段的非结构化集合。

5.2领域

字段是Lucene.net的实际内容所有者:它们基本上是一个哈希表,具有名称和值。 如果我们有无限的磁盘空间和无限的处理能力,那就是我们所需要知道的。 但是不幸的是,磁盘空间和处理能力受到限制,因此您不能仅仅分析所有内容并将其存储到索引中。 但是Lucene.net提供了将字段添加到索引的不同方法。

Lucene提供了四种不同类型的字段供开发人员选择: KeywordUnIndexedUnStoredText 。 您应该使用哪种字段类型取决于您要如何使用该字段及其值。

关键字字段未标记,但被逐字索引并存储在索引中。 此字段适用于应完整保留原始值的字段,例如URL,日期,个人姓名,社会保险号,电话号码等。

未索引字段既没有标记也没有索引,但它们的值存储在逐字索引中。 该字段适用于需要与搜索结果一起显示但绝不会直接搜索其值的字段。 由于未对该类型的字段编制索引,因此对其进行搜索很慢。 由于此类型的字段的原始值存储在索引中,因此如果存在索引大小的问题,则此类型不适合存储值非常大的字段。

未存储字段与未索引字段相反。 此类型的字段已标记并建立索引,但未存储在索引中。 此字段适用于索引大量不需要以其原始形式检索的文本,例如网页正文或任何其他类型的文本文档。

文本字段被标记,索引并存储在索引中。 这意味着可以搜索这种类型的字段,但是请注意存储为“文本”字段的字段的大小。

如果您回顾一下LuceneIndexExample类,您将看到我使用了Text字段:

document.add(Field.Text("fieldname", text));

如果要更改字段fieldname的类型,我们将调用Field类的其他方法之一:

document.add(Field.Keyword("fieldname", text));

要么

document.add(Field.UnIndexed("fieldname", text));

要么

document.add(Field.UnStored("fieldname", text));

尽管Field.TextField.KeywordField.UnIndexedField.UnStored调用最初看起来像是对构造函数的调用,但实际上它们只是对不同Field类方法的调用。 表1总结了不同的字段类型。

现场方法/类型 代币化 索引 已储存
Field.Keyword(String, String) 没有
Field.UnIndexed(String, String) 没有 没有
Field.UnStored(String, String) 没有
Field.Text(String, String)
Field.Text(String, Reader) 没有

表1:不同字段类型的概述。

5.3在Lucene中增强文档

在信息检索中,文档与搜索的相关性通过与查询的相似程度来衡量。 Lucene中实现了几种相似性模型,您可以通过扩展相似性类并使用Lucene保存的索引统计信息来实现自己的相似性模型。 还可以为文档分配静态分数,以表示它们在整体语料库中的重要性,而与正在执行的查询无关,例如其受欢迎程度,评分或PageRank。

在Lucene 4.0之前,您可以通过调用document.setBoost为文档分配静态分数。 在内部,通过将字段的提升因子乘以文档的提升因子,将提升应用于文档的每个字段。 但是,这永远无法正常工作,并且取决于所执行查询的类型,可能根本不会影响文档的排名。

通过在Lucene中添加DocValues,增强文档就像添加NumericDocValuesField并将其用于CustomScoreQuery一样简单, CustomScoreQuery将计算所得的分数乘以“ boost”字段的值。 下面的代码示例说明了如何实现此目的:

// add two documents to the index
Document doc = new Document();
doc.add(new TextField("f", "test document", Store.NO));
doc.add(new NumericDocValuesField("boost", 1L));
writer.addDocument(doc); doc = new Document();
doc.add(new TextField("f", "test document", Store.NO));
doc.add(new NumericDocValuesField("boost", 2L));
writer.addDocument(doc); // search for 'test' while boosting by field 'boost'
Query baseQuery = new TermQuery(new Term("f", "test"));
Query boostQuery = new FunctionQuery(new LongFieldSource("boost"));
Query q = new CustomScoreQuery(baseQuery, boostQuery);
searcher.search(q, 10);

通过编写一个简单的公式,新的Expressions模块也可以用于增强文档,如下所示。 尽管比使用CustomScoreQuery更为冗长,但它通过计算更复杂的公式(例如sqrt(_score)+ ln(boost))来提高效率。

Expression expr = JavascriptCompiler.compile("_score * boost");
SimpleBindings bindings = new SimpleBindings();
bindings.add(new SortField("_score", SortField.Type.SCORE));
bindings.add(new SortField("boost", SortField.Type.LONG));
Sort sort = new Sort(expr.getSortField(bindings, true));
searcher.search(baseQuery, null, 10, sort);

既然Lucene允许在不重新索引文档的情况下更新NumericDocValuesField ,您就可以将频繁变化的字段(受欢迎程度,评分,价格,最后修改时间…)合并到提升因素中,而无需每次对其中任何一个更改时都重新索引文档。

翻译自: https://www.javacodegeeks.com/2015/09/building-a-search-index-with-lucene.html

建立索引lucene

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

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

相关文章

spring javafx_Oracle Spring Clean JavaFX应该吗?

spring javafx我们确实在Codename One上依赖JavaFX&#xff0c;我们的模拟器需要它。 我们的桌面版本使用它&#xff0c;而我们的设计器工具基于Swing。 我们希望它成功&#xff0c;这对我们的业务至关重要&#xff01; 即使您是Java EE开发人员并且不关心桌面编程&#xff0c;…

哪些著名软件是用C、C++编写的?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删经常跟大家谈论C/C是多么的厉害&#xff0c;但总是耳听为虚&#xff0c;还需眼见为实&#xff0c;那如何做到眼见为实呢&#xff1f;当然还是要从…

java ee 下版本_将旧版本从Java EE 5减少到7

java ee 下版本Java EE 5于2005年首次引入&#xff0c;而Java EE 7于2013年问世。这两个版本之间存在7年的差距&#xff0c;从技术角度来说&#xff0c;这就像一个世纪。 许多组织仍然对使用Java EE 5感到困惑&#xff0c;并且有很多正当的理由选择不升级。 不过&#xff0c;如…

哪款 Linux 才是更好的 CentOS 替代品?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删AlmaLinux 是基于 RHEL 的企业级 Linux 发行版。以下是选择 AlmaLinux 作为 CentOS 替代方案的一些原因。CentOS 将于 2024 年 6 月到期。截至 2…

绩效从C到S,分享渣渣程序员逆袭秘诀!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删绩效面谈结束&#xff0c;从会议室出来&#xff0c;有一种不真实的感觉——这个季度我竟然拿了S&#xff1f;&#xff01;要知道&#xff0c;上个…

海贼王为什么画风突变_什么是突变测试?

海贼王为什么画风突变最近&#xff0c;我再三提到突变测试一词。 因为可以说这种方法能够以超出代码覆盖范围的方式检测测试安全网的空白&#xff0c;所以我花了一些时间来追赶这个话题并尝试一下。 这篇文章总结了我的发现&#xff0c;作为对该主题的快速介绍。 什么是变异测…

C语言 #define 与 typedef 的区别与用法

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删在C语言编程中&#xff0c;typedef 和 #define是最常用语句&#xff0c;可能很多工作过几年的工程师都没有去深究过它们的一些用法和区别。typed…

硬核!400 行代码实现一个虚拟机

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删我们都知道理工科类的大学专业&#xff0c;一般都会在大一选择教授 C 语言作为编程入门语言&#xff0c;我最初接触编程也是入的 C 语言的坑。课…

Spring集成基础知识

本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中&#xff0c;向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来&#xff0c;您将深入研究Spring Integration的基础知识&#xff0c;例如通道&#xff0c;转换器和适配器。 在这…

C++最佳实践 | 工具

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删前言C最佳实践: 支持Fork的编码标准文档本文档旨在收集对C最佳实践所进行的协作性讨论&#xff0c;是《Effective C》(Meyers) 和《C Coding Sta…

C语言函数返回 1 和返回 0 哪个好?

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删基本上&#xff0c;没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高、耦合性低的原则&#xff0c;尽可能的将代码拆分…

抽象工厂和工厂方法示例_抽象工厂设计模式示例

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

史上最污技术解读,我竟然秒懂了

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删假设你是个妹子&#xff0c;你有一位男朋友&#xff0c;于此同时你和另外一位男生暧昧不清&#xff0c;比朋友好&#xff0c;又不是恋人。你随时…

tdd java_Java TDD简介–第1部分

tdd java欢迎来到测试驱动开发 &#xff08;TDD&#xff09;系列的介绍。 我们将在TDD上下文中讨论Java和JUnit &#xff0c;但这只是工具。 本文的主要目的是使您全面了解TDD&#xff0c;而无论使用哪种编程语言和测试框架。 如果您在项目中不使用TDD&#xff0c;那么您要么是…

C++最佳实践 | 代码风格

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删C最佳实践:1. 工具2. 代码风格&#xff08;本文&#xff09;3. 安全性4. 可维护性5. 可移植性及多线程6. 性能7. 正确性和脚本代码风格代码风格最…

okhttp 连接池_okhttp 源码分析

https://square.github.io/okhttp/​square.github.iosquare/okhttp​github.com0 概述okhttp是一个现代的网络请求框架Http/2 支持 所有访问同一个主机的Request都共用一个socketconnection pool 连接池 减少请求延迟GZIP 压缩数据&#xff0c;减少传输所用的带宽Response Cac…

程序员日均写7行代码被开除,公司:正常员工每天200行

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删根据前不久CSDN发布的《2021-2022中国开发者调查报告》显示&#xff0c;大部分程序员平均每天会写200行左右的代码。那么代码的数量能衡量一个程…

抽象工厂和工厂方法示例_工厂方法设计模式示例

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

这10个C语言技巧让初学者少走180天弯路!

点击蓝字关注我们因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络&#xff0c;侵删技巧 1&#xff1a;不要使用“GOTO”语句二十几年前&#xff0c;当计算机编程尚处于起步阶段时&#xff0c;程序流程是由“GOTO”语句来控制。该…

hystrix熔断 简介_Hystrix简介

hystrix熔断 简介在过去的几天里&#xff0c;我一直在探索Netflix Hystrix库&#xff0c;并欣赏了这个出色的库所提供的功能。 引用Hystrix网站上的内容&#xff1a; Hystrix是一个延迟和容错库&#xff0c;旨在隔离对远程系统&#xff0c;服务和第三方库的访问点&#xff0c…