JonasSearch – Suchmaschine
Volltextsuche über den Index, den crawler.py in PostgreSQL aufgebaut hat.
Die Engine sucht in der Tabelle pages und nutzt dabei PostgreSQLs
Volltextsuche (tsvector / tsquery).
Starten
CLI:
python3 search/cli.py "raspberry pi"
python3 search/cli.py "postgres" --domain example.com --page 2
python3 search/cli.py "amplifier" --json
HTTP-API + Suchseite:
python3 search/api.py
# Suchseite: http://localhost:8082/
# JSON-API: http://localhost:8082/search?q=raspberry%20pi
Als Bibliothek:
from search import SearchEngine
engine = SearchEngine()
result = engine.search("postgres", page=1, per_page=10)
for hit in result.hits:
print(hit.position, hit.title, hit.url)
Funktionsweise
- Index-Nutzung: Die Engine sucht automatisch die tsvector-Spalte der
Tabelle
pages(z. B.search_vector, die ein Trigger pflegt) und durchsucht sie per@@-Operator. Fehlt eine solche Spalte, wird der Suchvektor zur Laufzeit austitle+headings+contentberechnet – die Suche funktioniert dann genauso, nur langsamer. - Ranking: Sortierung nach
ts_rankabsteigend, danach nach Crawl-Zeitpunkt. - Snippets:
ts_headlineerzeugt Ausschnitte, in denen die Suchbegriffe mit<mark>hervorgehoben sind. - Präfix-Suche: Jeder Begriff wird mit
:*gesucht, „raspberr" findet also auch „raspberry". - UND-Verknüpfung: Mehrere Begriffe müssen alle vorkommen.
- Paginierung:
--page/--per-page(max. 50). - Filter:
--domain(exakte Domain) und--tld(z. B..de).
Umgebungsvariablen
Wie der Crawler (siehe .env.example):
| Variable | Bedeutung | Standard |
|---|---|---|
JONASSEARCH_DB_HOST |
DB-Host | 127.0.0.1 |
JONASSEARCH_DB_PORT |
DB-Port | 25432 |
JONASSEARCH_DB_NAME |
DB-Name | jonassearch |
JONASSEARCH_DB_USER |
DB-User | jonassearch |
JONASSEARCH_DB_PASSWORD |
DB-Passwort | leer |
JONASSEARCH_TS_CONFIG |
PostgreSQL-Textsuch-Konfiguration | german |
JONASSEARCH_VECTOR_COLUMN |
tsvector-Spalte erzwingen (optional) | automatisch |
JONASSEARCH_API_HOST |
Bind-Adresse der API | 0.0.0.0 |
JONASSEARCH_API_PORT |
Port der API | 8082 |
Abhängigkeiten
psycopg2(DB-Zugriff)python-dotenv(.env-Datei)flask(nur fürsearch/api.py)