国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Lucene輕量級(jí)搜索引擎,真的太強(qiáng)了!!!Solr 和 ES 都是基于它

這篇具有很好參考價(jià)值的文章主要介紹了Lucene輕量級(jí)搜索引擎,真的太強(qiáng)了!!!Solr 和 ES 都是基于它。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、基礎(chǔ)知識(shí)

1、Lucene 是什么

Lucene 是一個(gè)本地全文搜索引擎,Solr 和 ElasticSearch 都是基于 Lucene 的封裝

Lucene 適合那種輕量級(jí)的全文搜索,我就是服務(wù)器資源不夠,如果上 ES 的話會(huì)很占用服務(wù)器資源,所有就選擇了 Lucene 搜索引擎

2、倒排索引原理

全文搜索的原理是使用了倒排索引,那么什么是倒排索引呢?

  1. 先通過(guò)中文分詞器,將文檔中包含的關(guān)鍵字全部提取出來(lái),比如我愛(ài)中國(guó),會(huì)通過(guò)分詞器分成我,愛(ài),中國(guó),然后分別對(duì)應(yīng)‘我愛(ài)中國(guó)’
  2. 然后再將關(guān)鍵字與文檔的對(duì)應(yīng)關(guān)系保存起來(lái)
  3. 最后對(duì)關(guān)鍵字本身做索引排序

3、與傳統(tǒng)數(shù)據(jù)庫(kù)對(duì)比

Lucene DB
數(shù)據(jù)庫(kù)表(table) 索引(index)
行(row) 文檔(document)
列(column) 字段(field)

4、數(shù)據(jù)類型

常見(jiàn)的字段類型

  1. StringField:這是一個(gè)不可分詞的字符串字段類型,適用于精確匹配和排序。
  2. TextField:這是一個(gè)可分詞的字符串字段類型,適用于全文搜索和模糊匹配。
  3. IntField、LongField、FloatField、DoubleField:這些是數(shù)值字段類型,用于存儲(chǔ)整數(shù)和浮點(diǎn)數(shù)。
  4. DateField:這是一個(gè)日期字段類型,用于存儲(chǔ)日期和時(shí)間。
  5. BinaryField:這是一個(gè)二進(jìn)制字段類型,用于存儲(chǔ)二進(jìn)制數(shù)據(jù),如圖片、文件等。
  6. StoredField:這是一個(gè)存儲(chǔ)字段類型,用于存儲(chǔ)不需要被索引的原始數(shù)據(jù),如文檔的內(nèi)容或其他附加信息。

Lucene 分詞器是將文本內(nèi)容分解成單獨(dú)的詞匯(term)的工具。Lucene 提供了多種分詞器,其中一些常見(jiàn)的包括

  1. StandardAnalyzer:這是 Lucene 默認(rèn)的分詞器,它使用 UnicodeText 解析器將文本轉(zhuǎn)換為小寫字母,并且根據(jù)空格、標(biāo)點(diǎn)符號(hào)和其他字符來(lái)進(jìn)行分詞。
  2. CJKAnalyzer:這個(gè)分詞器專門為中日韓語(yǔ)言設(shè)計(jì),它可以正確地處理中文、日文和韓文的分詞。
  3. KeywordAnalyzer:這是一個(gè)不分詞的分詞器,它將輸入的文本作為一個(gè)整體來(lái)處理,常用于處理精確匹配的情況。
  4. SimpleAnalyzer:這是一個(gè)非常簡(jiǎn)單的分詞器,它僅僅按照非字母字符將文本分割成小寫詞匯。
  5. WhitespaceAnalyzer:這個(gè)分詞器根據(jù)空格將文本分割成小寫詞匯,不會(huì)進(jìn)行任何其他的處理。

但是對(duì)于中文分詞器,我們一般常用第三方分詞器IKAnalyzer,需要引入它的POM文件

二、最佳實(shí)踐

1、依賴導(dǎo)入

<lucene.version>8.1.1</lucene.version>
<IKAnalyzer-lucene.version>8.0.0</IKAnalyzer-lucene.version>

<!--============lucene?start================-->
<!--?Lucene核心庫(kù)?-->
<dependency>
????<groupId>org.apache.lucene</groupId>
????<artifactId>lucene-core</artifactId>
????<version>${lucene.version}</version>
</dependency>

<!--?Lucene的查詢解析器?-->
<dependency>
????<groupId>org.apache.lucene</groupId>
????<artifactId>lucene-queryparser</artifactId>
????<version>${lucene.version}</version>
</dependency>

<!--?Lucene的默認(rèn)分詞器庫(kù)?-->
<dependency>
????<groupId>org.apache.lucene</groupId>
????<artifactId>lucene-analyzers-common</artifactId>
????<version>${lucene.version}</version>
</dependency>

<!--?Lucene的高亮顯示?-->
<dependency>
????<groupId>org.apache.lucene</groupId>
????<artifactId>lucene-highlighter</artifactId>
????<version>${lucene.version}</version>
</dependency>

<!--?ik分詞器?-->
<dependency>
????<groupId>com.jianggujin</groupId>
????<artifactId>IKAnalyzer-lucene</artifactId>
????<version>${IKAnalyzer-lucene.version}</version>
</dependency>
<!--============lucene?end================-->

2、創(chuàng)建索引

  1. 先制定索引的基本數(shù)據(jù),包括索引名稱和字段
/**
?*?@author:?sunhhw
?*?@date:?2023/12/25?17:39
?*?@description:?定義文章文檔字段和索引名稱
?*/

public?interface?IArticleIndex?{

????/**
?????*?索引名稱
?????*/

????String?INDEX_NAME?=?"article";

????//?---------------------?文檔字段?---------------------
????String?COLUMN_ID?=?"id";
????String?COLUMN_ARTICLE_NAME?=?"articleName";
????String?COLUMN_COVER?=?"cover";
????String?COLUMN_SUMMARY?=?"summary";
????String?COLUMN_CONTENT?=?"content";
????String?COLUMN_CREATE_TIME?=?"createTime";
}
  1. 創(chuàng)建索引并新增文檔
/**
?*?創(chuàng)建索引并設(shè)置數(shù)據(jù)
?*
?*?@param?indexName?索引地址
?*/

public?void?addDocument(String?indexName,?List<Document>?documentList)?{
????//?配置索引的位置?例如:indexDir?=?/app/blog/index/article
????String?indexDir?=?luceneProperties.getIndexDir()?+?File.separator?+?indexName;
????try?{
????????File?file?=?new?File(indexDir);
????????//?若不存在,則創(chuàng)建目錄
????????if?(!file.exists())?{
????????????FileUtils.forceMkdir(file);
????????}
????????//?讀取索引目錄
????????Directory?directory?=?FSDirectory.open(Paths.get(indexDir));
????????//?中文分析器
????????Analyzer?analyzer?=?new?IKAnalyzer();
????????//?索引寫出工具的配置對(duì)象
????????IndexWriterConfig?conf?=?new?IndexWriterConfig(analyzer);
????????//?創(chuàng)建索引
????????IndexWriter?indexWriter?=?new?IndexWriter(directory,?conf);
????????long?count?=?indexWriter.addDocuments(documentList);
????????log.info("[批量添加索引庫(kù)]總數(shù)量:{}",?documentList.size());
????????//?提交記錄
????????indexWriter.commit();
????????//?關(guān)閉close
????????indexWriter.close();
????}?catch?(Exception?e)?{
????????log.error("[創(chuàng)建索引失敗]indexDir:{}",?indexDir,?e);
????????throw?new?UtilsException("創(chuàng)建索引失敗",?e);
????}
}
  1. 注意這里有個(gè)坑,就是這個(gè)indexWriter.close();必須要關(guān)閉, 不然在執(zhí)行其他操作的時(shí)候會(huì)有一個(gè)write.lock文件鎖控制導(dǎo)致操作失敗
  2. indexWriter.addDocuments(documentList)這是批量添加,單個(gè)添加可以使用indexWriter.addDocument()
  1. 單元測(cè)試
@Test
public?void?create_index_test()?{
????ArticlePO?articlePO?=?new?ArticlePO();
????articlePO.setArticleName("git的基本使用"?+?i);
????articlePO.setContent("這里是git的基本是用的內(nèi)容"?+?i);
????articlePO.setSummary("測(cè)試摘要"?+?i);
????articlePO.setId(String.valueOf(i));
????articlePO.setCreateTime(LocalDateTime.now());
????Document?document?=?buildDocument(articlePO);
????LuceneUtils.X.addDocument(IArticleIndex.INDEX_NAME,?document);
}

private?Document?buildDocument(ArticlePO?articlePO)?{
????Document?document?=?new?Document();
????LocalDateTime?createTime?=?articlePO.getCreateTime();
????String?format?=?LocalDateTimeUtil.format(createTime,?DateTimeFormatter.ISO_LOCAL_DATE);

????//?因?yàn)镮D不需要分詞,使用StringField字段
????document.add(new?StringField(IArticleIndex.COLUMN_ID,?articlePO.getId()?==?null???""?:?articlePO.getId(),?Field.Store.YES));
????//?文章標(biāo)題articleName需要搜索,所以要分詞保存
????document.add(new?TextField(IArticleIndex.COLUMN_ARTICLE_NAME,?articlePO.getArticleName()?==?null???""?:?articlePO.getArticleName(),?Field.Store.YES));
????//?文章摘要summary需要搜索,所以要分詞保存
????document.add(new?TextField(IArticleIndex.COLUMN_SUMMARY,?articlePO.getSummary()?==?null???""?:?articlePO.getSummary(),?Field.Store.YES));
?????//?文章內(nèi)容content需要搜索,所以要分詞保存
????document.add(new?TextField(IArticleIndex.COLUMN_CONTENT,?articlePO.getContent()?==?null???""?:?articlePO.getContent(),?Field.Store.YES));
????//?文章封面不需要分詞,但是需要被搜索出來(lái)展示
????document.add(new?StoredField(IArticleIndex.COLUMN_COVER,?articlePO.getCover()?==?null???""?:?articlePO.getCover()));
????//?創(chuàng)建時(shí)間不需要分詞,僅需要展示
????document.add(new?StringField(IArticleIndex.COLUMN_CREATE_TIME,?format,?Field.Store.YES));
????return?document;
}

3、更新文檔

  1. 更新索引方法
/**
?*?更新文檔
?*
?*?@param?indexName?索引地址
?*?@param?document??文檔
?*?@param?condition?更新條件
?*/

public?void?updateDocument(String?indexName,?Document?document,?Term?condition)?{
????String?indexDir?=?luceneProperties.getIndexDir()?+?File.separator?+?indexName;
????try?{
????????//?讀取索引目錄
????????Directory?directory?=?FSDirectory.open(Paths.get(indexDir));
????????//?中文分析器
????????Analyzer?analyzer?=?new?IKAnalyzer();
????????//?索引寫出工具的配置對(duì)象
????????IndexWriterConfig?conf?=?new?IndexWriterConfig(analyzer);
????????//?創(chuàng)建索引
????????IndexWriter?indexWriter?=?new?IndexWriter(directory,?conf);
????????indexWriter.updateDocument(condition,?document);
????????indexWriter.commit();
????????indexWriter.close();
????}?catch?(Exception?e)?{
????????log.error("[更新文檔失敗]indexDir:{},document:{},condition:{}",?indexDir,?document,?condition,?e);
????????throw?new?ServiceException();
????}
}
  1. 單元測(cè)試
@Test
public?void?update_document_test()?{
????ArticlePO?articlePO?=?new?ArticlePO();
????articlePO.setArticleName("git的基本使用=編輯");
????articlePO.setContent("這里是git的基本是用的內(nèi)容=編輯");
????articlePO.setSummary("測(cè)試摘要=編輯");
????articlePO.setId("2");
????articlePO.setCreateTime(LocalDateTime.now());
????Document?document?=?buildDocument(articlePO);
????LuceneUtils.X.updateDocument(IArticleIndex.INDEX_NAME,?document,?new?Term("id",?"2"));
}
  1. 更新的時(shí)候,如果存在就更新那條記錄,如果不存在就會(huì)新增一條記錄
  2. new Term("id", "2")搜索條件,跟數(shù)據(jù)庫(kù)里的where id = 2差不多
  3. IArticleIndex.INDEX_NAME = article 索引名稱

4、刪除文檔

  1. 刪除文檔方法
/**
*?刪除文檔
*
*?@param?indexName?索引名稱
*?@param?condition?更新條件
*/

public?void?deleteDocument(String?indexName,?Term?condition)?{
??String?indexDir?=?luceneProperties.getIndexDir()?+?File.separator?+?indexName;
??try?{
??????//?讀取索引目錄
??????Directory?directory?=?FSDirectory.open(Paths.get(indexDir));
??????//?索引寫出工具的配置對(duì)象
??????IndexWriterConfig?conf?=?new?IndexWriterConfig();
??????//?創(chuàng)建索引
??????IndexWriter?indexWriter?=?new?IndexWriter(directory,?conf);

??????indexWriter.deleteDocuments(condition);
??????indexWriter.commit();
??????indexWriter.close();
??}?catch?(Exception?e)?{
??????log.error("[刪除文檔失敗]indexDir:{},condition:{}",?indexDir,?condition,?e);
??????throw?new?ServiceException();
??}
}
  1. 單元測(cè)試
@Test
public?void?delete_document_test()?{
????LuceneUtils.X.deleteDocument(IArticleIndex.INDEX_NAME,?new?Term(IArticleIndex.COLUMN_ID,?"1"));
}
  1. 刪除文檔跟編輯文檔類似

5、刪除索引

把改索引下的數(shù)據(jù)全部清空

/**
*?刪除索引
*
*?@param?indexName?索引地址
*/

public?void?deleteIndex(String?indexName)?{
??String?indexDir?=?luceneProperties.getIndexDir()?+?File.separator?+?indexName;
??try?{
??????//?讀取索引目錄
??????Directory?directory?=?FSDirectory.open(Paths.get(indexDir));
??????//?索引寫出工具的配置對(duì)象
??????IndexWriterConfig?conf?=?new?IndexWriterConfig();
??????//?創(chuàng)建索引
??????IndexWriter?indexWriter?=?new?IndexWriter(directory,?conf);
??????indexWriter.deleteAll();
??????indexWriter.commit();
??????indexWriter.close();
??}?catch?(Exception?e)?{
??????log.error("[刪除索引失敗]indexDir:{}",?indexDir,?e);
??????throw?new?ServiceException();
??}
}

6、普通查詢

  1. TermQuery查詢
Term?term?=?new?Term("title",?"lucene");
Query?query?=?new?TermQuery(term);

上述代碼表示通過(guò)精確匹配字段"title"中包含"lucene"的文檔。

  1. PhraseQuery查詢
PhraseQuery.Builder?builder?=?new?PhraseQuery.Builder();
builder.add(new?Term("content",?"open"));
builder.add(new?Term("content",?"source"));
PhraseQuery?query?=?builder.build();

上述代碼表示在字段"content"中查找包含"open source"短語(yǔ)的文檔

  1. BooleanQuery查詢
TermQuery?query1?=?new?TermQuery(new?Term("title",?"lucene"));
TermQuery?query2?=?new?TermQuery(new?Term("author",?"john"));
BooleanQuery.Builder?builder?=?new?BooleanQuery.Builder();
builder.add(query1,?BooleanClause.Occur.MUST);
builder.add(query2,?BooleanClause.Occur.MUST);
BooleanQuery?query?=?builder.build();

上述代碼表示使用布爾查詢同時(shí)滿足"title"字段包含"lucene"和"author"字段包含"john"的文檔。

  1. WildcardQuery查詢
WildcardQuery示例:
java
WildcardQuery?query?=?new?WildcardQuery(new?Term("title",?"lu*n?e"));

上述代碼表示使用通配符查詢匹配"title"字段中以"lu"開(kāi)頭,且第三個(gè)字符為任意字母,最后一個(gè)字符為"e"的詞項(xiàng)

  1. MultiFieldQueryParser查詢
String[]?fields?=?{"title",?"content",?"author"};
Analyzer?analyzer?=?new?StandardAnalyzer();

MultiFieldQueryParser?parser?=?new?MultiFieldQueryParser(fields,?analyzer);
Query?query?=?parser.parse("lucene?search");

a. 在"title", "content", "author"三個(gè)字段中搜索關(guān)鍵字"lucene search"的文本數(shù)據(jù) b. MultiFieldQueryParser 默認(rèn)使用 OR 運(yùn)算符將多個(gè)字段的查詢結(jié)果合并,即只要在任意一個(gè)字段中匹配成功即

可以使用MultiFieldQueryParser查詢來(lái)封裝一個(gè)簡(jiǎn)單的搜索工具類,這個(gè)較為常用

/**
*?關(guān)鍵詞搜索
*
*?@param?indexName?索引目錄
*?@param?keyword???查詢關(guān)鍵詞
*?@param?columns???被搜索的字段
*?@param?current???當(dāng)前頁(yè)
*?@param?size??????每頁(yè)數(shù)據(jù)量
*?@return
*/

public?List<Document>?search(String?indexName,?String?keyword,?String[]?columns,?int?current,?int?size)?{
??String?indexDir?=?luceneProperties.getIndexDir()?+?File.separator?+?indexName;
??try?{
??????//?打開(kāi)索引目錄
??????Directory?directory?=?FSDirectory.open(Paths.get(indexDir));
??????IndexReader?reader?=?DirectoryReader.open(directory);
??????IndexSearcher?searcher?=?new?IndexSearcher(reader);
??????//?中文分析器
??????Analyzer?analyzer?=?new?IKAnalyzer();
??????//?查詢解析器
??????QueryParser?parser?=?new?MultiFieldQueryParser(columns,?analyzer);
??????//?解析查詢關(guān)鍵字
??????Query?query?=?parser.parse(keyword);
??????//?執(zhí)行搜索,獲取匹配查詢的前?limit?條結(jié)果。
??????int?limit?=?current?*?size;
??????//?搜索前?limit?條結(jié)果
??????TopDocs?topDocs?=?searcher.search(query,?limit);?
??????//?匹配的文檔數(shù)組
??????ScoreDoc[]?scoreDocs?=?topDocs.scoreDocs;
??????//?計(jì)算分頁(yè)的起始?-?結(jié)束位置
??????int?start?=?(current?-?1)?*?size;
??????int?end?=?Math.min(start?+?size,?scoreDocs.length);
??????//?返回指定頁(yè)碼的文檔
??????List<Document>?documents?=?new?ArrayList<>();
??????for?(int?i?=?start;?i?<?end;?i++)?{
??????????Document?doc?=?searcher.doc(scoreDocs[i].doc);
??????????documents.add(doc);
??????}
??????//?釋放資源
??????reader.close();
??????return?documents;
??}?catch?(Exception?e)?{
??????log.error("查詢?Lucene?錯(cuò)誤:?",?e);
??????return?null;
??}
}

7、關(guān)鍵字高亮

@Test
public?void?searchArticle()?throws?InvalidTokenOffsetsException,?IOException,?ParseException?{
????String?keyword?=?"安裝";
????String[]?fields?=?{IArticleIndex.COLUMN_CONTENT,?IArticleIndex.COLUMN_ARTICLE_NAME};
????//?先查詢出文檔列表
????List<Document>?documentList?=?LuceneUtils.X.search(IArticleIndex.INDEX_NAME,?keyword,?fields,?1,?100);

????//?中文分詞器
????Analyzer?analyzer?=?new?IKAnalyzer();
????//?搜索條件
????QueryParser?queryParser?=?new?MultiFieldQueryParser(fields,?analyzer);
????//?搜索關(guān)鍵詞,也就是需要高亮的字段
????Query?query?=?queryParser.parse(keyword);
????//?高亮html語(yǔ)句
????Formatter?formatter?=?new?SimpleHTMLFormatter("<span style=\"color:?#f73131\">",?"</span>");
????QueryScorer?scorer?=?new?QueryScorer(query);
????Highlighter?highlighter?=?new?Highlighter(formatter,?scorer);
????//?設(shè)置片段長(zhǎng)度,一共展示的長(zhǎng)度
????highlighter.setTextFragmenter(new?SimpleFragmenter(50));
????List<SearchArticleVO>?list?=?new?ArrayList<>();

????for?(Document?doc?:?documentList)?{
????????SearchArticleVO?articleVO?=?new?SearchArticleVO();
????????articleVO.setId(doc.get(IArticleIndex.COLUMN_ID));
????????articleVO.setCover(doc.get(IArticleIndex.COLUMN_COVER));
????????articleVO.setArticleName(doc.get(IArticleIndex.COLUMN_ARTICLE_NAME));
????????articleVO.setSummary(doc.get(IArticleIndex.COLUMN_SUMMARY));
????????articleVO.setCreateTime(LocalDate.parse(doc.get(IArticleIndex.COLUMN_CREATE_TIME)));
????????for?(String?field?:?fields)?{
????????????//?為文檔生成高亮
????????????String?text?=?doc.get(field);
????????????//?使用指定的分析器對(duì)文本進(jìn)行分詞
????????????TokenStream?tokenStream?=?TokenSources.getTokenStream(field,?text,?analyzer);
????????????//?找到其中一個(gè)關(guān)鍵字就行了
????????????String?bestFragment?=?highlighter.getBestFragment(tokenStream,?text);
????????????if?(StringUtils.isNotBlank(bestFragment))?{
????????????????//?輸出高亮結(jié)果,取第一條即可
????????????????if?(field.equals(IArticleIndex.COLUMN_ARTICLE_NAME))?{
????????????????????articleVO.setArticleName(bestFragment);
????????????????}
????????????????if?(field.equals(IArticleIndex.COLUMN_CONTENT))?{
????????????????????articleVO.setSummary(bestFragment);
????????????????}
????????????}
????????}
????????list.add(articleVO);
????}
}

我是一零貳肆,一個(gè)關(guān)注Java技術(shù)和記錄生活的博主。

歡迎掃碼關(guān)注“一零貳肆”的公眾號(hào),一起學(xué)習(xí),共同進(jìn)步,多看路,少踩坑。

Lucene輕量級(jí)搜索引擎,真的太強(qiáng)了!!!Solr 和 ES 都是基于它文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-838698.html

到了這里,關(guān)于Lucene輕量級(jí)搜索引擎,真的太強(qiáng)了!!!Solr 和 ES 都是基于它的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【表達(dá)式引擎】簡(jiǎn)單高效的輕量級(jí)Java表達(dá)式引擎:Aviator

    【表達(dá)式引擎】簡(jiǎn)單高效的輕量級(jí)Java表達(dá)式引擎:Aviator

    Aviator 是一個(gè)高性能、、輕量級(jí)的表達(dá)式引擎,支持表達(dá)式動(dòng)態(tài)求值。其設(shè)計(jì)目標(biāo)為輕量級(jí)和高性能,相比于 Groovy 和 JRuby 的笨重, Aviator 就顯得更加的小巧。與其他的輕量級(jí)表達(dá)式引擎不同,其他的輕量級(jí)表達(dá)式引擎基本都是通過(guò)解釋代碼的方式來(lái)運(yùn)行,而 Aviator 則是直接

    2024年02月09日
    瀏覽(98)
  • Orillusion引擎正式開(kāi)源!AIGC時(shí)代下的WebGPU輕量級(jí)3D渲染引擎!

    Orillusion引擎正式開(kāi)源!AIGC時(shí)代下的WebGPU輕量級(jí)3D渲染引擎!

    開(kāi)源生態(tài)的建設(shè)根植于社區(qū),開(kāi)發(fā)者在社區(qū)共享、共創(chuàng)、共贏,將會(huì)激發(fā)出無(wú)限的創(chuàng)造力,這就是開(kāi)源最大的魅力! 選擇開(kāi)源,源于我們堅(jiān)信,“獨(dú)行快,眾行遠(yuǎn)”! WebGPU經(jīng)過(guò)六年的時(shí)間,終于在2023年4月6日,由Chrome團(tuán)隊(duì)發(fā)布。5月2號(hào),在Chrome113版本上,WebGPU被默認(rèn)啟動(dòng)。

    2024年02月11日
    瀏覽(21)
  • 教你使用PHP實(shí)現(xiàn)一個(gè)輕量級(jí)HTML模板引擎

    教你使用PHP實(shí)現(xiàn)一個(gè)輕量級(jí)HTML模板引擎

    ??作者簡(jiǎn)介,黑夜開(kāi)發(fā)者,全棧領(lǐng)域新星創(chuàng)作者?,2023年6月csdn上海賽道top4。多年電商行業(yè)從業(yè)經(jīng)驗(yàn),對(duì)系統(tǒng)架構(gòu),數(shù)據(jù)分析處理等大規(guī)模應(yīng)用場(chǎng)景有豐富經(jīng)驗(yàn)。 ??本文已收錄于PHP專欄:PHP進(jìn)階實(shí)戰(zhàn)教程。 ??另有專欄PHP入門基礎(chǔ)教程,希望各位大佬多多支持??。 在 W

    2024年02月15日
    瀏覽(101)
  • Spring Boot整合Postgres實(shí)現(xiàn)輕量級(jí)全文搜索

    Spring Boot整合Postgres實(shí)現(xiàn)輕量級(jí)全文搜索

    有這樣一個(gè)帶有搜索功能的用戶界面需求: 搜索流程如下所示: 這個(gè)需求涉及兩個(gè)實(shí)體: “評(píng)分(Rating)、用戶名(Username)”數(shù)據(jù)與 User 實(shí)體相關(guān) “創(chuàng)建日期(create date)、觀看次數(shù)(number of views)、標(biāo)題(title)、正文(body)”與 Story 實(shí)體相關(guān) 需要支持的功能對(duì) User

    2024年02月19日
    瀏覽(91)
  • 【java表達(dá)式引擎】四、高性能、輕量級(jí)的AviatorScript

    github:(https://github.com/killme2008/aviatorscript%60) 參考文檔1:https://www.yuque.com/boyan-avfmj/aviatorscript 參考博客2:https://blog.csdn.net/ZhangQingmu/article/details/125087255 Aviator起源于2011年,由國(guó)內(nèi)的開(kāi)發(fā)者開(kāi)源的,表達(dá)式引擎 表達(dá)式引擎當(dāng)時(shí)國(guó)內(nèi)開(kāi)源的已經(jīng)有 IKExpression,可惜是純解釋執(zhí)行的,

    2024年02月10日
    瀏覽(20)
  • 告別if else!試試這款輕量級(jí)流程引擎吧,跟SpringBoot絕配!

    告別if else!試試這款輕量級(jí)流程引擎吧,跟SpringBoot絕配!

    之前同事用了一款輕量級(jí)的規(guī)則引擎腳本 AviatorScript ,我也跟著用了起來(lái),真的挺香,能少寫很多代碼。這期就給大家介紹一下這款規(guī)則引擎。 AviatorScript 是一門高性能、輕量級(jí)寄宿于 JVM (包括 Android 平臺(tái))之上的腳本語(yǔ)言。 它起源于2010年,作者對(duì)當(dāng)時(shí)已有的一些產(chǎn)品不是

    2024年02月13日
    瀏覽(34)
  • SimSearch:一個(gè)輕量級(jí)的springboot項(xiàng)目索引構(gòu)建工具,實(shí)現(xiàn)快速模糊搜索

    大部分項(xiàng)目都會(huì)涉及模糊搜索功能,而實(shí)現(xiàn)模糊搜索一般分為兩個(gè)派系: like簡(jiǎn)約派系 搜索引擎派系 對(duì)于較為大型的項(xiàng)目來(lái)說(shuō),使用Solr、ES或者M(jìn)ilvus之類的引擎是比較流行的選擇了(效果只能說(shuō)優(yōu)秀),而對(duì)于中小型項(xiàng)目,如果考慮這些較為重型的引擎,就意味著開(kāi)發(fā)成本和

    2024年02月02日
    瀏覽(30)
  • DP讀書(shū):社區(qū)文檔(小白向)解讀——iSulad 輕量級(jí)容器引擎功能介紹以及代碼架構(gòu)解析

    DP讀書(shū):社區(qū)文檔(小白向)解讀——iSulad 輕量級(jí)容器引擎功能介紹以及代碼架構(gòu)解析

    容器技術(shù)方案) 每天逛這openEuler的社區(qū)和社群,總是看到iSulad,今天啃已啃這個(gè)項(xiàng)目的入門玩法: lifeng2221dd1 2020-09-14 作者簡(jiǎn)介:李峰, 具有多年容器、操作系統(tǒng)軟件開(kāi)發(fā)經(jīng)驗(yàn),對(duì)容器引擎、runtime 等領(lǐng)域有比較深入的研究與理解。深度參與 lxc、containers 等開(kāi)源容器社區(qū)?,F(xiàn)在

    2024年02月21日
    瀏覽(20)
  • ASP.NET基于Ajax+Lucene構(gòu)建搜索引擎的設(shè)計(jì)和實(shí)現(xiàn)

    ASP.NET基于Ajax+Lucene構(gòu)建搜索引擎的設(shè)計(jì)和實(shí)現(xiàn)

    3?需求分析 3.1?同步環(huán)境 本系統(tǒng)的同步環(huán)境如圖3: 添加圖片注釋,不超過(guò) 140 字(可選) 功能需求 本設(shè)計(jì)要實(shí)現(xiàn)的功能: 1. 能夠?qū)nternet上的網(wǎng)頁(yè)內(nèi)容、標(biāo)題、鏈接等信息按鏈?zhǔn)绞占?2. 能夠?qū)崿F(xiàn)一定鏈接深度的網(wǎng)頁(yè)收集,也就是在Internet上實(shí)現(xiàn)一定的URL級(jí)的數(shù)據(jù)收錄。

    2024年02月03日
    瀏覽(24)
  • Lucene和Solr和Elasticsearch區(qū)別,全文檢索引擎工具包Lucene索引流程和搜索流程實(shí)操

    Lucene和Solr和Elasticsearch區(qū)別,全文檢索引擎工具包Lucene索引流程和搜索流程實(shí)操

    我們生活中的數(shù)據(jù)總體分為兩種: 結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù) 。 結(jié)構(gòu)化數(shù)據(jù) :指具有固定格式或有限長(zhǎng)度的數(shù)據(jù),如數(shù)據(jù)庫(kù),元數(shù)據(jù)等。 非結(jié)構(gòu)化數(shù)據(jù) :指不定長(zhǎng)或無(wú)固定格式的數(shù)據(jù),如 互聯(lián)網(wǎng)數(shù)據(jù)、郵件,word文檔等。 非結(jié)構(gòu)化數(shù)據(jù)又有一種叫法叫全文數(shù)據(jù) 按照數(shù)據(jù)的

    2024年02月03日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包