74 lines
2.3 KiB
Markdown
74 lines
2.3 KiB
Markdown
# 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`) |