Lucene 作為一款高性能的全文檢索引擎庫,其核心功能圍繞索引和搜索文本數據,但它也支持多種數據類型以滿足復雜的應用場景。以下是 Lucene 支持的主要數據類型及其用途的詳細說明:
1. 文本類型(Text)
-
用途:全文搜索、分詞處理。
-
特點:
- 分詞(Tokenization):文本字段會被分詞器(如
StandardAnalyzer
)拆分為詞項(Term),便于模糊匹配、短語查詢等。 - 存儲形式:通常使用
TextField
類型。
- 分詞(Tokenization):文本字段會被分詞器(如
-
示例:
// 定義 Text 類型字段
FieldType textFieldType = new FieldType();
textFieldType.setStored(true); // 存儲原始值
textFieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS); // 索引詞項及其位置
textFieldType.setTokenized(true); // 啟用分詞
Field textField = new Field(“content”, “Lucene is a search library”, textFieldType);
2. 字符串類型(String)
-
用途:精確值匹配(如 ID、狀態碼、標簽)。
-
特點:
- 不分詞:字段值作為一個整體存儲和索引。
- 存儲形式:通常使用
StringField
類型。
-
示例:
// 定義 String 類型字段(精確匹配)
Field idField = new StringField(“id”, “doc123”, Field.Store.YES);
3. 數值類型(Numeric)
-
用途:范圍查詢(如價格、年齡)、排序、聚合。
-
實現方式:
- 舊版(Lucene 4.x 之前):使用
IntField
、LongField
、FloatField
等。 - 新版(Lucene 5+):統一使用
PointField
(基于 BKD 樹的高效數值索引)。
- 舊版(Lucene 4.x 之前):使用
-
示例(新版):
// 定義數值字段(IntPoint)
Field priceField = new IntPoint(“price”, 100);
// 存儲原始值(需額外存儲字段)
document.add(new StoredField(“price”, 100));
4. 日期類型(Date)
-
用途:時間范圍查詢、按時間排序。
-
實現方式:
- 將日期轉換為 Unix 時間戳(長整型),再通過
LongPoint
存儲。
- 將日期轉換為 Unix 時間戳(長整型),再通過
-
示例:
// 將日期轉換為時間戳
Date date = new Date();
long timestamp = date.getTime();
// 定義日期字段
document.add(new LongPoint(“timestamp”, timestamp));
document.add(new StoredField(“timestamp”, timestamp));
5. 二進制類型(Binary)
-
用途:存儲原始二進制數據(如圖片、PDF 文件)。
-
特點:
- 二進制數據不會被索引,僅存儲原始內容。
- 使用
StoredField
或BinaryDocValuesField
。
-
示例:
// 讀取文件并存儲為二進制
byte[] fileData = Files.readAllBytes(Paths.get(“image.png”));
document.add(new StoredField(“file”, fileData));
6. 地理位置(Geospatial)
-
用途:地理位置范圍查詢(如經緯度)。
-
實現方式:
- 使用
LatLonPoint
存儲經緯度,支持矩形范圍查詢或距離查詢。
- 使用
-
示例:
// 定義地理位置字段
document.add(new LatLonPoint(“location”, 40.7128, -74.0060)); // 紐約坐標
// 查詢矩形范圍內的點
Query query = LatLonPoint.newBoxQuery(“location”, 40.6, 40.8, -74.1, -73.9);
7. 文檔值(DocValues)
-
用途:排序、聚合、分組(類似數據庫的列式存儲)。
-
特點:
- 按文檔 ID 快速訪問字段值,適合非文本字段的高效計算。
- 支持數值、字符串、二進制等類型。
-
示例:
// 添加數值型 DocValues 字段
document.add(new NumericDocValuesField(“price”, 100));
8. 詞向量(Term Vectors)
-
用途:存儲詞項的位置、偏移量信息,支持高亮(Highlighting)。
-
實現方式:
- 在
FieldType
中啟用termVectors
標志。
- 在
-
示例:
FieldType vectorFieldType = new FieldType();
vectorFieldType.setStored(true);
vectorFieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
vectorFieldType.setStoreTermVectors(true); // 啟用詞向量
Field vectorField = new Field(“content”, “text data”, vectorFieldType);
9. 多值字段(Multi-Valued Fields)
-
用途:允許一個字段存儲多個值(如標簽、分類)。
-
實現方式:
- 同一字段多次添加到文檔中。
-
示例:
document.add(new StringField(“tag”, “java”, Field.Store.YES));
document.add(new StringField(“tag”, “search”, Field.Store.YES));
總結:Lucene 數據類型對比
數據類型 | 典型用途 | 是否分詞 | 是否支持范圍查詢 | 存儲方式 |
---|---|---|---|---|
Text | 全文搜索、模糊匹配 | 是 | 否 | 倒排索引 + 詞向量 |
String | 精確匹配(ID、狀態碼) | 否 | 否 | 倒排索引 |
Numeric | 數值范圍查詢、排序 | 否 | 是 | Point 索引 + DocValues |
Date | 時間范圍查詢 | 否 | 是 | Point 索引 + DocValues |
Binary | 存儲二進制文件 | 否 | 否 | 原始存儲 |
Geospatial | 地理位置查詢 | 否 | 是 | Point 索引 |
DocValues | 排序、聚合 | 否 | 是 | 列式存儲 |
Term Vectors | 高亮、詞項位置追蹤 | 是 | 否 | 倒排索引擴展 |
選擇數據類型的注意事項
- 性能優化:
- 頻繁范圍查詢的數值字段使用
PointField
。 - 需要高亮時啟用
Term Vectors
。
- 頻繁范圍查詢的數值字段使用
- 存儲開銷:
DocValues
和StoredField
會增加存儲空間。
- 版本兼容性:
- Lucene 5+ 棄用舊版
NumericField
,推薦統一使用PointField
。
- Lucene 5+ 棄用舊版
通過合理選擇數據類型,可以顯著提升 Lucene 的搜索性能和資源利用率。