Skip to content

Metadata Extraction, Indexing, and Search Tooling

A digital archive without robust metadata is just a dumping ground for data. This guide covers CLI utilities, automated extraction patterns, and database indexing strategies used to catalog and search large-scale digital collections.


Essential Extraction Utilities

1. ExifTool (Images, Documents, Media)

ExifTool reads, writes, and manipulates metadata across virtually all file formats.

# Extract comprehensive JSON metadata for a file
exiftool -j -g image.tiff > image_metadata.json

# Extract recursively across a directory, ignoring duplicate tags
exiftool -r -json -ext jpg -ext tiff /path/to/archive > catalog.json

2. MediaInfo (Audio / Video Pipelines)

MediaInfo extracts technical stream attributes (codecs, frame rates, color spaces, bit depths) necessary for AV archives.

# Output full technical breakdown in JSON format
mediainfo --Output=JSON video_master.mkv > video_metadata.json

3. FITS (File Information Toolset)

Developed by Harvard University Library, FITS wraps multiple extraction tools (ExifTool, MediaInfo, DROID, Jhove) into a single unified XML output.

# Run FITS extraction against a directory
fits.sh -i /path/to/incoming/sip -o /path/to/metadata/

Sidecar Metadata Workflow

To prevent corrupting original binary files during indexing, store descriptive and technical metadata in external JSON or YAML sidecar files alongside the master asset.

Example Directory Structure

/archive/2026/DOC001/
├── master_document.tiff
└── master_document.tiff.json   <-- Sidecar metadata

Automated Sidecar Generation Script

Save this script as generate_sidecars.sh to automatically build sidecars for incoming assets:

#!/usr/bin/env bash
set -euo pipefail

TARGET_DIR="${1:-.}"

find "$TARGET_DIR" -type f \( -name "*.tiff" -o -name "*.jpg" -o -name "*.mov" -o -name "*.mp4" \) | while read -r file; do
    sidecar="${file}.json"
    if [ ! -f "$sidecar" ]; then
        echo "Extracting metadata for: $file"
        exiftool -json -g "$file" > "$sidecar"
    fi
done

Indexing & Full-Text Search Engines

Once sidecars are generated, ingest them into a centralized query layer for rapid discovery.

Tool Type Best For Typical Workflow
SQLite Embedded Database Small to mid-sized local collections Ingest JSON sidecars into SQLite JSON1 extension tables.
Meilisearch Lightweight Search Engine Rapid web-based document search Index sidecar JSON objects directly for instant UI search.
Elasticsearch Enterprise Indexer Millions of complex assets Ingest sidecars, OCR transcripts, and full text for complex boolean queries.

Ingesting Sidecars into SQLite (Example)

# Create SQLite database and table
sqlite3 archive_index.db "CREATE TABLE assets(id INTEGER PRIMARY KEY, path TEXT, metadata JSON);"

# Ingest a sidecar file directly into the JSON column
sqlite3 archive_index.db "INSERT INTO assets(path, metadata) VALUES('/archive/photo.jpg', readfile('photo.jpg.json'));"