126 lines
2.9 KiB
Markdown
126 lines
2.9 KiB
Markdown
# OSIRIS
|
||
|
||
**Object Storage, Indexing & Retrieval Intelligent System**
|
||
|
||
OSIRIS is a Rust-native object storage and retrieval layer built on top of HeroDB, providing structured storage with metadata, field indexing, and search capabilities.
|
||
|
||
## Features
|
||
|
||
- **Object Storage**: Store structured objects with metadata (title, tags, MIME type, timestamps)
|
||
- **Namespace Management**: Organize objects into isolated namespaces
|
||
- **Field Indexing**: Fast filtering by tags and metadata fields
|
||
- **Text Search**: Simple keyword-based search across object content
|
||
- **CLI Interface**: Command-line tools for object management and search
|
||
- **9P Filesystem**: Mount OSIRIS as a filesystem (future)
|
||
|
||
## Quick Start
|
||
|
||
### Prerequisites
|
||
|
||
Start HeroDB:
|
||
```bash
|
||
cd /path/to/herodb
|
||
cargo run --release -- --dir ./data --admin-secret mysecret --port 6379
|
||
```
|
||
|
||
### Installation
|
||
|
||
```bash
|
||
cd /path/to/osiris
|
||
cargo build --release
|
||
```
|
||
|
||
### Initialize
|
||
|
||
```bash
|
||
# Create configuration
|
||
mkdir -p ~/.config/osiris
|
||
cat > ~/.config/osiris/config.toml <<EOF
|
||
[herodb]
|
||
url = "redis://localhost:6379"
|
||
|
||
[namespaces.notes]
|
||
db_id = 1
|
||
EOF
|
||
|
||
# Initialize OSIRIS
|
||
./target/release/osiris init --herodb redis://localhost:6379
|
||
|
||
# Create a namespace
|
||
./target/release/osiris ns create notes
|
||
```
|
||
|
||
### Usage
|
||
|
||
```bash
|
||
# Add objects
|
||
./target/release/osiris put notes/my-note.md ./my-note.md --tags topic=rust,project=osiris
|
||
|
||
# Get objects
|
||
./target/release/osiris get notes/my-note.md
|
||
|
||
# Search
|
||
./target/release/osiris find --ns notes --filter topic=rust
|
||
./target/release/osiris find "retrieval" --ns notes
|
||
|
||
# Delete objects
|
||
./target/release/osiris del notes/my-note.md
|
||
|
||
# Show statistics
|
||
./target/release/osiris stats --ns notes
|
||
```
|
||
|
||
## Architecture
|
||
|
||
```
|
||
HeroDB (unmodified)
|
||
│
|
||
├── KV store + encryption
|
||
└── RESP protocol
|
||
↑
|
||
│
|
||
└── OSIRIS
|
||
├── store/ – object schema + persistence
|
||
├── index/ – field index & keyword scanning
|
||
├── retrieve/ – query planner + filtering
|
||
├── interfaces/ – CLI, 9P
|
||
└── config/ – namespaces + settings
|
||
```
|
||
|
||
## Data Model
|
||
|
||
Objects are stored with metadata:
|
||
- **ID**: Unique identifier (UUID or user-assigned)
|
||
- **Namespace**: Logical grouping (e.g., "notes", "calendar")
|
||
- **Title**: Optional human-readable title
|
||
- **MIME Type**: Content type
|
||
- **Tags**: Key-value pairs for categorization
|
||
- **Timestamps**: Created and updated times
|
||
- **Text Content**: Optional plain text content
|
||
|
||
## Keyspace Design
|
||
|
||
```
|
||
meta:<id> → serialized OsirisObject
|
||
field:<field>:<val> → Set of IDs (for equality filtering)
|
||
scan:index → list of IDs for text scan
|
||
```
|
||
|
||
Example:
|
||
```
|
||
field:tag:project=osiris → {note_1, note_2}
|
||
field:mime:text/markdown → {note_1, note_3}
|
||
```
|
||
|
||
## Future Enhancements
|
||
|
||
- Content-addressable deduplication
|
||
- Vector embeddings for semantic search
|
||
- Relation graphs
|
||
- Full-text search with Tantivy
|
||
- 9P filesystem interface
|
||
|
||
## License
|
||
|
||
See LICENSE file.
|