132 lines
4.1 KiB
Plaintext
132 lines
4.1 KiB
Plaintext
|
|
#!/bin/bash
|
||
|
|
# ═══════════════════════════════════════════════════════════════
|
||
|
|
# Alfred Linux v2.0-b5 — Meilisearch Local Search Engine
|
||
|
|
#
|
||
|
|
# Installs Meilisearch for offline local search.
|
||
|
|
# BUILD: v2.0-b5 (Search)
|
||
|
|
# ═══════════════════════════════════════════════════════════════
|
||
|
|
|
||
|
|
set -e
|
||
|
|
|
||
|
|
echo "[Alfred Linux v2.0-b5] Installing Meilisearch..."
|
||
|
|
|
||
|
|
# ── 1. Download Meilisearch binary ──
|
||
|
|
MEILI_VER="v1.13.3"
|
||
|
|
MEILI_URL="https://github.com/meilisearch/meilisearch/releases/download/${MEILI_VER}/meilisearch-linux-amd64"
|
||
|
|
wget -q "$MEILI_URL" -O /usr/local/bin/meilisearch || {
|
||
|
|
echo "[WARN] Meilisearch download failed, trying latest..."
|
||
|
|
curl -L https://install.meilisearch.com | sh
|
||
|
|
mv meilisearch /usr/local/bin/meilisearch
|
||
|
|
}
|
||
|
|
chmod +x /usr/local/bin/meilisearch
|
||
|
|
|
||
|
|
# ── 2. Create meilisearch user ──
|
||
|
|
useradd -r -s /bin/false -d /var/lib/meilisearch meilisearch 2>/dev/null || true
|
||
|
|
mkdir -p /var/lib/meilisearch
|
||
|
|
chown meilisearch:meilisearch /var/lib/meilisearch
|
||
|
|
|
||
|
|
# ── 3. Systemd service ──
|
||
|
|
cat > /etc/systemd/system/meilisearch.service << 'SVC'
|
||
|
|
[Unit]
|
||
|
|
Description=Meilisearch Local Search Engine
|
||
|
|
Documentation=https://docs.meilisearch.com
|
||
|
|
After=network.target
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
ExecStart=/usr/local/bin/meilisearch --db-path /var/lib/meilisearch --http-addr 127.0.0.1:7700 --no-analytics
|
||
|
|
User=meilisearch
|
||
|
|
Group=meilisearch
|
||
|
|
Restart=always
|
||
|
|
RestartSec=5
|
||
|
|
LimitNOFILE=65536
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
SVC
|
||
|
|
systemctl enable meilisearch 2>/dev/null || true
|
||
|
|
|
||
|
|
# ── 4. Alfred Search CLI ──
|
||
|
|
cat > /usr/local/bin/alfred-search << 'SEARCH'
|
||
|
|
#!/bin/bash
|
||
|
|
# Alfred Search — local search powered by Meilisearch
|
||
|
|
# Usage: alfred-search "query"
|
||
|
|
|
||
|
|
QUERY="${*:-}"
|
||
|
|
if [[ -z "$QUERY" ]]; then
|
||
|
|
echo "Usage: alfred-search <query>"
|
||
|
|
echo "Search local documentation and files."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Check if Meilisearch is running
|
||
|
|
if ! curl -s http://localhost:7700/health | grep -q available; then
|
||
|
|
echo "Meilisearch is not running. Start with: sudo systemctl start meilisearch"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Search
|
||
|
|
RESULT=$(curl -s "http://localhost:7700/multi-search" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d "{\"queries\": [{\"indexUid\": \"docs\", \"q\": \"$QUERY\", \"limit\": 5}]}" 2>/dev/null)
|
||
|
|
|
||
|
|
if echo "$RESULT" | python3 -c "
|
||
|
|
import sys, json
|
||
|
|
data = json.load(sys.stdin)
|
||
|
|
results = data.get('results', [{}])[0].get('hits', [])
|
||
|
|
if not results:
|
||
|
|
print('No results found.')
|
||
|
|
else:
|
||
|
|
for r in results:
|
||
|
|
title = r.get('title', r.get('path', 'Untitled'))
|
||
|
|
snippet = r.get('content', '')[:200]
|
||
|
|
print(f' → {title}')
|
||
|
|
print(f' {snippet}')
|
||
|
|
print()
|
||
|
|
" 2>/dev/null; then
|
||
|
|
:
|
||
|
|
else
|
||
|
|
echo "Search returned no parseable results."
|
||
|
|
fi
|
||
|
|
SEARCH
|
||
|
|
chmod +x /usr/local/bin/alfred-search
|
||
|
|
|
||
|
|
# ── 5. First-boot indexer script ──
|
||
|
|
cat > /usr/local/bin/alfred-index-docs << 'INDEX'
|
||
|
|
#!/bin/bash
|
||
|
|
# Index local documentation into Meilisearch
|
||
|
|
echo "Indexing local documentation..."
|
||
|
|
|
||
|
|
# Wait for Meilisearch
|
||
|
|
for i in {1..30}; do
|
||
|
|
curl -s http://localhost:7700/health | grep -q available && break
|
||
|
|
sleep 1
|
||
|
|
done
|
||
|
|
|
||
|
|
# Index man pages
|
||
|
|
DOCS='[]'
|
||
|
|
ID=0
|
||
|
|
for f in /usr/share/doc/*/README* /usr/share/doc/*/changelog*; do
|
||
|
|
[[ -f "$f" ]] || continue
|
||
|
|
CONTENT=$(head -c 5000 "$f" 2>/dev/null | tr -d '\0' | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))" 2>/dev/null)
|
||
|
|
[[ -z "$CONTENT" ]] && continue
|
||
|
|
DOCS=$(echo "$DOCS" | python3 -c "
|
||
|
|
import sys, json
|
||
|
|
docs = json.load(sys.stdin)
|
||
|
|
docs.append({'id': $ID, 'path': '$f', 'title': '$(basename "$(dirname "$f")")', 'content': $CONTENT})
|
||
|
|
print(json.dumps(docs))
|
||
|
|
" 2>/dev/null)
|
||
|
|
((ID++))
|
||
|
|
[[ $ID -ge 500 ]] && break
|
||
|
|
done
|
||
|
|
|
||
|
|
# Push to Meilisearch
|
||
|
|
echo "$DOCS" | curl -s -X POST "http://localhost:7700/indexes/docs/documents" \
|
||
|
|
-H "Content-Type: application/json" \
|
||
|
|
-d @- > /dev/null 2>&1
|
||
|
|
|
||
|
|
echo "Indexed $ID documents."
|
||
|
|
INDEX
|
||
|
|
chmod +x /usr/local/bin/alfred-index-docs
|
||
|
|
|
||
|
|
echo "[Alfred Linux v2.0-b5] Meilisearch installed and configured."
|