Files
search/search/README.md
T
2026-09-02 19:54:49 +02:00

74 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:
```bash
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:
```bash
python3 search/api.py
# Suchseite: http://localhost:8082/
# JSON-API: http://localhost:8082/search?q=raspberry%20pi
```
Als Bibliothek:
```python
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 aus `title` + `headings` + `content` berechnet –
die Suche funktioniert dann genauso, nur langsamer.
- **Ranking:** Sortierung nach `ts_rank` absteigend, danach nach
Crawl-Zeitpunkt.
- **Snippets:** `ts_headline` erzeugt 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ür `search/api.py`)