【lucene】使用docvalues的案例

下面給出一段 可直接跑通 的 Lucene 8.5.0 示例代碼,演示如何

?

1. 建索引時為兩個字段啟用 DocValues(一個 `NumericDocValues`,一個 `SortedDocValues`);??

2. 用 `IndexSearcher` 按 DocValues 排序;??

3. 用 `FacetsCollector` 做分組統計(相當于 SQL 的 `GROUP BY`)。

?

```java

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.codecs.lucene50.Lucene50Codec;

import org.apache.lucene.document.*;

import org.apache.lucene.index.*;

import org.apache.lucene.search.*;

import org.apache.lucene.store.ByteBuffersDirectory;

import org.apache.lucene.util.NumericUtils;

import org.apache.lucene.facet.*;

import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetCounts;

import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetField;

?

public class DocValuesDemo {

? ? public static void main(String[] args) throws Exception {

?

? ? ? ? /* ---------- 1. 創建內存目錄 ---------- */

? ? ? ? Directory dir = new ByteBuffersDirectory();

? ? ? ? IndexWriterConfig cfg = new IndexWriterConfig(new StandardAnalyzer());

? ? ? ? // 使用默認 codec 即可,DocValues 默認開啟

? ? ? ? cfg.setCodec(new Lucene50Codec());

? ? ? ? IndexWriter writer = new IndexWriter(dir, cfg);

?

? ? ? ? /* ---------- 2. 寫入三條示范文檔 ---------- */

? ? ? ? Document doc1 = new Document();

? ? ? ? doc1.add(new StringField("id", "1", Field.Store.YES));

? ? ? ? // 商品價:NumericDocValues,可排序、可聚合

? ? ? ? doc1.add(new NumericDocValuesField("price", 2999));

? ? ? ? // 商品品牌:SortedDocValues,可做 faceting

? ? ? ? doc1.add(new SortedSetDocValuesFacetField("brand", "小米"));

?

? ? ? ? Document doc2 = new Document();

? ? ? ? doc2.add(new StringField("id", "2", Field.Store.YES));

? ? ? ? doc2.add(new NumericDocValuesField("price", 3999));

? ? ? ? doc2.add(new SortedSetDocValuesFacetField("brand", "蘋果"));

?

? ? ? ? Document doc3 = new Document();

? ? ? ? doc3.add(new StringField("id", "3", Field.Store.YES));

? ? ? ? doc3.add(new NumericDocValuesField("price", 1999));

? ? ? ? doc3.add(new SortedSetDocValuesFacetField("brand", "小米"));

?

? ? ? ? writer.addDocument(doc1);

? ? ? ? writer.addDocument(doc2);

? ? ? ? writer.addDocument(doc3);

? ? ? ? writer.commit();

? ? ? ? writer.close();

?

? ? ? ? /* ---------- 3. 打開搜索器 ---------- */

? ? ? ? DirectoryReader reader = DirectoryReader.open(dir);

? ? ? ? IndexSearcher searcher = new IndexSearcher(reader);

?

? ? ? ? /* ---------- 4. 按價格升序排序 ---------- */

? ? ? ? Sort sort = new Sort(new SortField("price", SortField.Type.LONG));

? ? ? ? TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), 10, sort);

? ? ? ? for (ScoreDoc sd : topDocs.scoreDocs) {

? ? ? ? ? ? Document d = searcher.doc(sd.doc);

? ? ? ? ? ? System.out.println("id=" + d.get("id"));

? ? ? ? }

? ? ? ? // 輸出:

? ? ? ? // id=3 (1999)

? ? ? ? // id=1 (2999)

? ? ? ? // id=2 (3999)

?

? ? ? ? /* ---------- 5. 用 Facets 統計品牌分布 ---------- */

? ? ? ? FacetsCollector fc = new FacetsCollector();

? ? ? ? searcher.search(new MatchAllDocsQuery(), fc);

? ? ? ? Facets facets = new SortedSetDocValuesFacetCounts(fc);

? ? ? ? FacetResult result = facets.getTopChildren(10, "brand");

? ? ? ? for (LabelAndValue lav : result.labelValues) {

? ? ? ? ? ? System.out.println(lav.label + " : " + lav.value);

? ? ? ? }

? ? ? ? // 輸出:

? ? ? ? // 小米 : 2

? ? ? ? // 蘋果 : 1

?

? ? ? ? reader.close();

? ? ? ? dir.close();

? ? }

}

```

?

---

?

關鍵 API 回顧

?

目標 用到的 Lucene 類/方法?

聲明數值 DocValues `NumericDocValuesField`?

聲明字符串 DocValues `SortedSetDocValuesFacetField`?

排序 `SortField("price", Type.LONG)`?

分組/聚合 `FacetsCollector + SortedSetDocValuesFacetCounts`?

?

這樣就完整展示了 在 Lucene 8.5.0 中如何啟用、讀取并利用 DocValues 進行排序和聚合 的完整鏈路。

下面給出一份 可直接拷貝到 IDE 運行的 Lucene 8.5.0 完整示例,演示如何

1. 索引階段: ?
- 用 NumericDocValues 存價格(可排序/聚合) ?
- 用 SortedSetDocValuesFacetField 存品牌(可做分面統計) ?

2. 查詢階段: ?
- 按價格排序 ?
- 統計品牌分布 ?
- 鉆取(drill-down)過濾后再統計

---

? Maven 依賴(lucene-core + lucene-facet)

```xml
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>8.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-facet</artifactId>
<version>8.5.0</version>
</dependency>
```

---

? 代碼示例

```java
package demo;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.facet.*;
import org.apache.lucene.facet.sortedset.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.ByteBuffersDirectory;
import org.apache.lucene.store.Directory;

import java.util.List;

public class DocValuesDemo {
public static void main(String[] args) throws Exception {
Directory dir = new ByteBuffersDirectory();
IndexWriterConfig cfg = new IndexWriterConfig(new StandardAnalyzer());
IndexWriter writer = new IndexWriter(dir, cfg);

? ? ? ? FacetsConfig config = new FacetsConfig(); ? // 必須

? ? ? ? // 準備 3 條測試數據
addDoc(writer, config, "1", 1999, "小米");
addDoc(writer, config, "2", 3999, "蘋果");
addDoc(writer, config, "3", 2999, "小米");

? ? ? ? writer.commit();
writer.close();

? ? ? ? /* ---------- 查詢 ---------- */
DirectoryReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);

? ? ? ? /* 1. 按價格排序(NumericDocValues) */
Sort sort = new Sort(new SortField("price", SortField.Type.LONG));
TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), 10, sort);
System.out.println("按價格排序:");
for (ScoreDoc sd : topDocs.scoreDocs) {
Document doc = searcher.doc(sd.doc);
System.out.println("id=" + doc.get("id") +
", 價格=" + doc.get("price") +
", 品牌=" + doc.get("brand"));
}

? ? ? ? /* 2. 品牌分面統計(SortedSetDocValuesFacetField) */
SortedSetDocValuesReaderState state =
new DefaultSortedSetDocValuesReaderState(reader);
FacetsCollector fc = new FacetsCollector();
FacetsCollector.search(searcher, new MatchAllDocsQuery(), 10, fc);
Facets facets = new SortedSetDocValuesFacetCounts(state, fc);
FacetResult brandResult = facets.getTopChildren(10, "brand");
System.out.println("\n品牌統計:");
for (LabelAndValue lv : brandResult.labelValues) {
System.out.println(lv.label + " : " + lv.value);
}

? ? ? ? /* 3. 鉆取:只看 2010 年出版的書(示例維度) */
DrillDownQuery dq = new DrillDownQuery(config);
dq.add("brand", "小米"); ? ? ? ? ?// 鉆取小米
FacetsCollector fc2 = new FacetsCollector();
FacetsCollector.search(searcher, dq, 10, fc2);
Facets facets2 = new SortedSetDocValuesFacetCounts(state, fc2);
FacetResult afterDrill = facets2.getTopChildren(10, "brand");
System.out.println("\n鉆取后品牌統計:");
System.out.println(afterDrill);

? ? ? ? reader.close();
dir.close();
}

? ? private static void addDoc(IndexWriter w,
FacetsConfig config,
String id,
int price,
String brand) throws Exception {
Document doc = new Document();
doc.add(new StringField("id", id, Field.Store.YES)); ? ? ? ? ? ? ? ? // 普通字段
doc.add(new NumericDocValuesField("price", price)); ? ? ? ? ? ? ? ? ?// 數值 DocValues
doc.add(new SortedSetDocValuesFacetField("brand", brand)); ? ? ? ? ? // 分面 DocValues
w.addDocument(config.build(doc)); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 必須用 FacetsConfig.build
}
}
```

---

? 運行結果示例

```
按價格排序:
id=1, 價格=1999, 品牌=小米
id=3, 價格=2999, 品牌=小米
id=2, 價格=3999, 品牌=蘋果

品牌統計:
小米 : 2
蘋果 : 1

鉆取后品牌統計:
dim=brand path=[小米] value=2 childCount=0
```

---

? 小結

- NumericDocValues → 排序、范圍聚合 ?
- SortedSetDocValuesFacetField + FacetsConfig → 分面統計、鉆取 ?
- 代碼直接基于 Lucene 8.5.0,無需額外 codec 設置。

在 Lucene 中,`doc.get("price")` 返回 `null` 是因為 `price` 字段被定義為 `NumericDocValuesField`,而 `NumericDocValuesField` 不會存儲字段值。

?

它只用于 DocValues 索引,供排序、聚合等操作使用,但不會把值存入 `Document`。

?

---

?

? 解釋

?

- `NumericDocValuesField`??

? - 用途:用于快速排序、聚合等操作,數據存儲在 `.dvd` 文件中。??

? - 特點:不存儲字段值,只能通過 `IndexSearcher` 的 `DocValues` 接口訪問。

?

- `StoredField`??

? - 用途:用于存儲字段值,可以在 `Document` 中直接訪問。??

? - 特點:數據存儲在 `.fdt` 文件中。

?

---

?

? 解決方法

?

如果你想在 `Document` 中直接訪問字段值,需要同時添加一個 `StoredField`:

?

```java

doc.add(new NumericDocValuesField("price", price)); // 用于 DocValues 索引

doc.add(new StoredField("price", price)); // 用于存儲字段值

```

?

---

?

? 完整示例

?

```java

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.*;

import org.apache.lucene.facet.*;

import org.apache.lucene.facet.sortedset.*;

import org.apache.lucene.index.*;

import org.apache.lucene.search.*;

import org.apache.lucene.store.ByteBuffersDirectory;

?

public class DocValuesDemo {

? ? public static void main(String[] args) throws Exception {

? ? ? ? Directory dir = new ByteBuffersDirectory();

? ? ? ? IndexWriterConfig cfg = new IndexWriterConfig(new StandardAnalyzer());

? ? ? ? IndexWriter writer = new IndexWriter(dir, cfg);

?

? ? ? ? FacetsConfig config = new FacetsConfig();

?

? ? ? ? // 添加文檔

? ? ? ? addDoc(writer, config, "1", 1999, "小米");

? ? ? ? addDoc(writer, config, "2", 3999, "蘋果");

? ? ? ? addDoc(writer, config, "3", 2999, "小米");

?

? ? ? ? writer.commit();

? ? ? ? writer.close();

?

? ? ? ? // 打開索引

? ? ? ? DirectoryReader reader = DirectoryReader.open(dir);

? ? ? ? IndexSearcher searcher = new IndexSearcher(reader);

?

? ? ? ? // 按價格排序

? ? ? ? Sort sort = new Sort(new SortField("price", SortField.Type.LONG));

? ? ? ? TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), 10, sort);

?

? ? ? ? System.out.println("按價格排序:");

? ? ? ? for (ScoreDoc sd : topDocs.scoreDocs) {

? ? ? ? ? ? Document doc = searcher.doc(sd.doc);

? ? ? ? ? ? System.out.println("id=" + doc.get("id") +

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?", 價格=" + doc.get("price") + // 這里可以訪問 price

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?", 品牌=" + doc.get("brand"));

? ? ? ? }

?

? ? ? ? reader.close();

? ? ? ? dir.close();

? ? }

?

? ? private static void addDoc(IndexWriter w,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?FacetsConfig config,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String id,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int price,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String brand) throws Exception {

? ? ? ? Document doc = new Document();

? ? ? ? doc.add(new StringField("id", id, Field.Store.YES));

? ? ? ? doc.add(new NumericDocValuesField("price", price)); // 用于 DocValues 索引

? ? ? ? doc.add(new StoredField("price", price)); // 用于存儲字段值

? ? ? ? doc.add(new SortedSetDocValuesFacetField("brand", brand));

? ? ? ? w.addDocument(config.build(doc));

? ? }

}

```

?

---

?

? 輸出結果

?

```

按價格排序:

id=1, 價格=1999, 品牌=小米

id=3, 價格=2999, 品牌=小米

id=2, 價格=3999, 品牌=蘋果

```

?

---

?

? 總結

?

- `NumericDocValuesField`:用于 DocValues 索引,不存儲字段值。??

- `StoredField`:用于存儲字段值,可以在 `Document` 中直接訪問。??

- 如果需要同時支持 DocValues 索引和字段值訪問,需要同時添加這兩個字段。

也就是說docvalues是一種索引,不是存內容的只有storefield設為yes才是存原文的

對,你總結得很準確!

?

? DocValues 的本質

?

DocValues 是一種索引結構,用于高效地存儲和訪問列式數據(如數值、字符串等),主要用于以下場景:

?

1. 排序:快速按字段值排序(如價格、日期等)。

2. 聚合:快速計算字段值的統計信息(如最大值、最小值、平均值等)。

3. 分面統計:快速統計字段值的分布(如品牌、類別等)。

?

DocValues 不存儲原始文檔內容,而是將字段值編碼到索引文件中(如 `.dvd` 和 `.dvm` 文件),供快速讀取和計算。

?

---

?

? `StoredField` 的作用

?

`StoredField` 用于存儲原始字段值,以便在檢索時可以直接訪問這些值。它的特點如下:

?

- 存儲原始值:將字段值存儲在 `.fdt` 文件中。

- 可直接訪問:通過 `Document` 對象訪問存儲的字段值。

- 不參與索引:不會影響搜索、排序或聚合操作。

?

---

?

? 對比

?

特性 DocValues StoredField?

用途 索引結構,用于排序、聚合、分面統計 存儲結構,用于存儲原始字段值?

存儲位置 `.dvd` 和 `.dvm` 文件 `.fdt` 文件?

是否可直接訪問 不可直接訪問,需通過 `DocValues` 接口 可直接通過 `Document` 訪問?

是否參與索引 參與索引,用于快速讀取和計算 不參與索引,僅存儲原始值?

?

---

?

? 示例代碼

?

```java

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.*;

import org.apache.lucene.index.*;

import org.apache.lucene.search.*;

import org.apache.lucene.store.ByteBuffersDirectory;

?

public class DocValuesDemo {

? ? public static void main(String[] args) throws Exception {

? ? ? ? Directory dir = new ByteBuffersDirectory();

? ? ? ? IndexWriterConfig cfg = new IndexWriterConfig(new StandardAnalyzer());

? ? ? ? IndexWriter writer = new IndexWriter(dir, cfg);

?

? ? ? ? // 添加文檔

? ? ? ? Document doc1 = new Document();

? ? ? ? doc1.add(new StringField("id", "1", Field.Store.YES));

? ? ? ? doc1.add(new NumericDocValuesField("price", 1999)); // DocValues 索引

? ? ? ? doc1.add(new StoredField("price", 1999)); // 存儲原始值

? ? ? ? writer.addDocument(doc1);

?

? ? ? ? Document doc2 = new Document();

? ? ? ? doc2.add(new StringField("id", "2", Field.Store.YES));

? ? ? ? doc2.add(new NumericDocValuesField("price", 3999)); // DocValues 索引

? ? ? ? doc2.add(new StoredField("price", 3999)); // 存儲原始值

? ? ? ? writer.addDocument(doc2);

?

? ? ? ? writer.commit();

? ? ? ? writer.close();

?

? ? ? ? // 打開索引

? ? ? ? DirectoryReader reader = DirectoryReader.open(dir);

? ? ? ? IndexSearcher searcher = new IndexSearcher(reader);

?

? ? ? ? // 按價格排序

? ? ? ? Sort sort = new Sort(new SortField("price", SortField.Type.LONG));

? ? ? ? TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), 10, sort);

?

? ? ? ? System.out.println("按價格排序:");

? ? ? ? for (ScoreDoc sd : topDocs.scoreDocs) {

? ? ? ? ? ? Document doc = searcher.doc(sd.doc);

? ? ? ? ? ? System.out.println("id=" + doc.get("id") +

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?", 價格=" + doc.get("price")); // 可以直接訪問存儲的字段值

? ? ? ? }

?

? ? ? ? reader.close();

? ? ? ? dir.close();

? ? }

}

```

?

---

?

? 輸出結果

?

```

按價格排序:

id=1, 價格=1999

id=2, 價格=3999

```

?

---

?

? 總結

?

- DocValues:用于索引,支持高效排序、聚合和分面統計,但不存儲原始值。

- StoredField:用于存儲原始字段值,可在檢索時直接訪問,但不參與索引。

?

通過同時使用 `NumericDocValuesField` 和 `StoredField`,可以兼顧索引性能和原始值訪問的需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91455.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IntelliJ IDEA 配置 Maven 阿里云鏡像加速源全流程

1. 為什么要加國內鏡像源&#xff1f;國內網絡訪問 Maven 中央倉庫經常超時、依賴下載極慢或失敗。配置阿里云等國內鏡像后&#xff0c;Java 項目依賴下載飛快&#xff0c;極大提升開發效率&#xff0c;是中國開發者必做優化&#xff01;2. 添加阿里云鏡像源的步驟&#xff08;…

【worklist】worklist的hl7、dicom是什么關系

HL7和DICOM在Worklist系統中是互補的關系&#xff0c;它們各自承擔不同的角色&#xff0c;但協同工作以實現完整的醫療信息系統集成。HL7與DICOM Worklist的關系1. 功能分工DICOM Worklist (Modality Worklist - MWL)主要用于影像設備獲取患者和檢查信息基于DICOM協議&#xff…

位運算-面試題01.01.判定字符是否唯一-力扣(LeetCode)

一、題目解析1、s[i]僅包含小寫字母2、字符串的長度為[0&#xff0c;100]二、算法原理解法1&#xff1a;哈希表用哈希表記錄s[i]的字符&#xff0c;如果有重復的&#xff0c;則返回false優化1&#xff1a;由于s[i]中只有小寫字母&#xff0c;所以可以創建一個int hash[26]的數組…

wsl /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28‘ not found

遇到的問題并沒有解決&#xff0c;這個 glibc-2.28 應該是安裝好了 Ubuntu18 問題描述&#xff1a;Ubuntu18 WSL 無法啟動 VS Code &#xff0c;因為node版本問題 rootUbuntu18:~# code . /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28 not found (required by /root…

Windows系統ffmpeg.dll丟失怎么辦?從錯誤分析到永久修復的完整流程

您是否遇到過這樣的情況&#xff1a;打開心愛的視頻編輯軟件時&#xff0c;系統突然提示無法啟動此程序&#xff0c;因為計算機中丟失ffmpeg.dll&#xff1f;別擔心&#xff0c;這個問題比您想象的要常見得多。作為專業的技術支持團隊&#xff0c;我們已經幫助數千用戶解決了類…

LaTeX 復雜圖形繪制教程:從基礎到進階

系列文章目錄 第一章&#xff1a;深入了解 LaTeX&#xff1a;科技文檔排版的利器 第二章&#xff1a;LaTeX 下載安裝保姆級教程 第三章&#xff1a;LaTeX 創建工程并生成完整文檔指南 第四章&#xff1a;LaTeX 表格制作全面指南 文章目錄系列文章目錄前言一、?LaTeX 繪圖工具…

用 Go Typed Client 快速上手 Elasticsearch —— 從建索引到聚合的完整實戰

1. 準備工作 go get github.com/elastic/go-elasticsearch/v9小貼士 如果你的集群啟用了安全特性&#xff0c;需要在 elasticsearch.Config 中配置 Username/Password 或 APIKey。Typed Client 通過 NewTypedClient 創建&#xff0c;內部復用 *http.Client&#xff0c;建議全局…

《義龍棒球科普》棒球是韓國的國球嗎·棒球1號位

? Why Baseball is Koreas NATIONAL SPORT? | KBO熱血全解析 ?? 1. 歷史根源 & 情感紐帶 Historical Roots & Emotional Bond美軍引入 (1945后): 戰后美軍將棒球帶入韓國&#xff0c;迅速扎根&#xff01;?1982 KBO成立: 亞洲第二個職業棒球聯盟誕生&#xff01;奧…

三坐標測量機路徑規劃與補償技術:如何用算法看見微米級誤差?

三坐標測量的微米級精度背后&#xff0c;是精密的路徑規劃算法與實時補償技術在保駕護航。三坐標測量機的智能避撞算法保障了測量的安全與高效&#xff1b;溫度補償技術消除了環境的無形干擾&#xff1b;點云智能處理則讓海量數據蛻變為精準的工程決策依據。 “智能避讓路徑”&…

Docker設置容器時間

一、前言前言&#xff1a;容器搭建好之后&#xff0c;容器的默認時區于本地時區不一致&#xff0c;這將導致日志文件中保存的時間為錯誤時間。二、操作1、進入docker 容器docker exec -it <容器名稱> bash2、選擇時區tzselect3、配置時區根據跳出來的配置選擇Asia -> …

德國威樂集團亞太中東非洲PMO負責人和繼明受邀為PMO大會主持人

全國PMO專業人士年度盛會德國威樂集團亞太中東非洲PMO負責人 和繼明先生 受邀為“PMO評論”主辦的2025第十四屆中國PMO大會主持人&#xff0c;敬請關注&#xff01;嘉賓介紹&#xff1a;和繼明先生&#xff0c;德國威樂集團亞太中東非洲PMO負責人&#xff0c;項目管理碩士MPM&a…

idea 集成飛算Java AI 教程

idea 集成飛算Java AI 教程一、介紹二、下載安裝 飛算Java AI 插件方式一&#xff1a;從idea插件市場安裝方式二&#xff1a;下載離線安裝包三、飛算Java AI插件使用一、介紹 ? 隨著人工智能技術的發展&#xff0c;AI 編程助手逐漸成為提升開發效率的強大工具。上一篇教程是i…

2025.8.1

代碼練習 //用指針訪問對象成員 #include<iostream> #include<string> using namespace std; class Champion { public:Champion(int id, string nm, int hp, int mn, int dmg) {ID id;name nm;HP hp;mana mn;damage dmg;}void attack(Champion& chmp) {c…

一種新的分布式ID生成方案--ULID

一種新的分布式ID生成方案 ULID: 一種新的分布式ID生成方案 ULID (Universally Unique Lexicographically Sortable Identifier) 是一種較新的分布式ID生成方案&#xff0c;旨在解決傳統UUID和雪花算法(Snowflake)的一些局限性。ULID的主要特點 可排序性&#xff1a;ULID按生成…

服務器中涉及節流(Throttle)的硬件組件及其應用注意事項

服務器中涉及節流&#xff08;Throttle&#xff09;的硬件組件及其應用注意事項 在服務器硬件中&#xff0c;“節流”&#xff08;throttling&#xff09;是一種保護機制&#xff0c;當組件溫度過高、功耗過大或超出安全閾值時&#xff0c;系統會自動降低性能&#xff08;如時鐘…

GitPython07-源碼解讀

GitPython07-源碼解讀1 1-核心知識 1&#xff09;從核心代碼的第一行作為突破口2&#xff09;從Repo.init方法入手做追蹤3&#xff09;subprocess到底做了什么&#xff1f;gitPython是不是執行的腳本&#xff0c;最終還是通過subprocess做到的4&#xff09;代碼中貌似并沒有實…

Java繼承機制詳解:從原理到實戰應用

一、繼承的本質&#xff1a;消除冗余&#xff0c;構建邏輯關系想象一個公司管理系統&#xff1a;普通銷售員工&#xff08;CommissionEmployee&#xff09;和帶底薪銷售員工&#xff08;BasePlusCommissionEmployee&#xff09;共享大部分屬性&#xff08;姓名、工號、銷售額、…

工業數采引擎-DTU

DTU配置注冊包及心跳包(對應設備配置->設備SN)&#xff0c;模塊工作方式&#xff1a;TcpClient&#xff0c;首次連接成功后&#xff0c;DTU發送上來的注冊包作為鏈路SessionId1. ModbusRtu設備 -> Dtu -> Server2. DLT645設備 -> Dtu -> Server3. 自定義設備 -&…

AttributeError: ChatGLMTokenizer has no attribute vocab_size

請問運行下面語句tokenizer AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_codeTrue) 出現“AttributeError: ChatGLMTokenizer has no attribute vocab_size”是版本不一致&#xff0c;需要舊的版本卸載conda uninstall transformers或者pip un…

14.串口更新FLASH字庫

一、簡介 在使用STM32等單片機驅動顯示屏時&#xff0c;為了顯示中文字體&#xff0c;常用FLASH保存字庫信息。但是字庫的更新通常只能使用SD卡更新&#xff0c;在一些小型單片機系統(如STM32F103C8T6、STC89C52)上&#xff0c;沒有增加SD卡支持的必要。為解決此問題&#xff0…