在 Elasticsearch 中,`stored_fields` 是一個非常重要的概念,主要用于控制文檔存儲和檢索時的行為。以下是對 `stored_fields` 的詳細解釋:
?
1\. `stored_fields` 的作用
?
`stored_fields` 用于指定在檢索文檔時需要返回的字段。默認情況下,Elasticsearch 在索引文檔時會將所有字段存儲在 `_source` 中,而 `_source` 是一個 JSON 格式的字段,包含了完整的文檔內容。但是,有時我們并不需要檢索整個 `_source`,而是只需要某些特定字段。通過設置 `stored_fields`,可以優化檢索性能和存儲空間。
?
2\. 使用場景
?
- 優化性能:如果只需要檢索文檔中的某些字段,而不是整個 `_source`,設置 `stored_fields` 可以減少數據傳輸量,從而提高檢索性能。
- 節省存儲空間:在某些情況下,某些字段可能不需要存儲,或者只需要存儲部分字段用于檢索,這樣可以節省磁盤空間。
- 提高安全性:在某些場景下,某些字段可能包含敏感信息,通過設置 `stored_fields`,可以避免這些字段被檢索或返回。
?
3\. 如何設置 `stored_fields`
?
在索引映射中設置
?
在創建索引時,可以通過映射(mapping)來指定哪些字段需要存儲。例如:
?
```json
PUT /my_index
{
? "mappings": {
? ? "properties": {
? ? ? "field1": {
? ? ? ? "type": "text",
? ? ? ? "store": true // 設置為 true 表示存儲該字段
? ? ? },
? ? ? "field2": {
? ? ? ? "type": "keyword",
? ? ? ? "store": false // 設置為 false 表示不存儲該字段
? ? ? }
? ? }
? }
}
```
?
- `store: true` 表示該字段會被單獨存儲,可以在檢索時通過 `stored_fields` 參數返回。
- `store: false` 表示該字段不會被單獨存儲,只能通過 `_source` 獲取。
?
在檢索時使用 `stored_fields` 參數
?
在查詢文檔時,可以通過 `stored_fields` 參數指定需要返回的字段。例如:
?
```json
GET /my_index/_search
{
? "query": {
? ? "match_all": {}
? },
? "stored_fields": ["field1", "field2"] // 指定返回的字段
}
```
?
如果字段被設置為 `store: true`,則可以通過 `stored_fields` 參數返回該字段的值。如果字段沒有被存儲(`store: false`),則無法通過 `stored_fields` 返回,只能通過 `_source` 獲取。
?
4\. `stored_fields` 與 `_source` 的區別
?
- 存儲方式:
? - `_source` 是一個 JSON 格式的字段,包含完整的文檔內容,存儲在 Lucene 的 `_source` 字段中。
? - `stored_fields` 是單獨存儲的字段,存儲在 Lucene 的存儲字段中,可以單獨檢索。
- 檢索性能:
? - 檢索 `_source` 時,需要解析整個 JSON 數據,性能相對較低。
? - 檢索 `stored_fields` 時,直接返回存儲的字段值,性能更高。
- 適用場景:
? - `_source` 適用于需要完整文檔內容的場景,例如更新文檔、重新索引等。
? - `stored_fields` 適用于只需要部分字段的場景,例如快速檢索某些字段的值。
?
5\. 注意事項
?
- 存儲成本:雖然 `stored_fields` 可以提高檢索性能,但存儲字段會占用額外的磁盤空間。因此,需要根據實際需求合理選擇存儲的字段。
- 字段類型:某些字段類型(如 `text` 類型的字段)在存儲時會占用較多空間,需要謹慎使用。
- 更新字段:如果需要更新存儲的字段,需要重新索引文檔,因為存儲的字段在文檔索引后無法直接修改。
?
通過合理使用 `stored_fields`,可以優化 Elasticsearch 的性能和存儲效率,滿足不同的檢索需求。