Erstellen Sie einen Suchindex für den Inhalt mehrerer SQLite-Datenbanktabellen und führen Sie mit Datasette facettierte Suchvorgänge durch
Ein Live-Beispiel dieses Plugins läuft unter https://datasette.io/-/beta – konfiguriert mit dieser YAML-Datei.
Weitere Informationen zur Funktionsweise dieses Beispiels finden Sie unter Erstellen einer Suchmaschine für datasette.io.
Installieren Sie dieses Tool wie folgt:
$ pip install dogsheep-beta
Führen Sie den Indexer mit dem Befehlszeilentool dogsheep-beta
aus:
$ dogsheep-beta index dogsheep.db config.yml
Die Datei config.yml
enthält Details zu den Datenbanken und Dokumenttypen, die indiziert werden sollen:
twitter.db :
tweets :
sql : |-
select
tweets.id as key,
'Tweet by @' || users.screen_name as title,
tweets.created_at as timestamp,
tweets.full_text as search_1
from tweets join users on tweets.user = users.id
users :
sql : |-
select
id as key,
name || ' @' || screen_name as title,
created_at as timestamp,
description as search_1
from users
Dadurch wird eine Tabelle search_index
in der Datenbank dogsheep.db
erstellt, die mit Daten aus diesen SQL-Abfragen gefüllt wird.
Standardmäßig ist der Suchindex, den dieses Tool erstellt, für Porter-Stemming konfiguriert. Das bedeutet, dass bei der Suche nach Wörtern wie run
Dokumente gefunden werden, die runs
oder running
enthalten.
Wenn Sie Porter-Stemming nicht verwenden möchten, verwenden Sie die Option --tokenize none
:
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
Sie können hier andere SQLite-Tokenisierungsargumente übergeben. Weitere Informationen finden Sie in der Dokumentation zu SQLite FTS-Tokenisierern.
Die Spalten, die von unserer Abfrage zurückgegeben werden können, sind:
key
– ein eindeutiger (innerhalb dieses Typs) Primärschlüsseltitle
– der Titel für den Artikeltimestamp
– ein ISO8601-Zeitstempel, z. B. 2020-09-02T21:00:21
search_1
– ein größerer Textblock, der in den Suchindex aufgenommen werden sollcategory
– eine ganzzahlige Kategorie-ID, siehe untenis_public
– eine Ganzzahl (0 oder 1, standardmäßig 0, wenn nicht festgelegt), die angibt, ob dies öffentlich ist oder nichtÖffentliche Aufzeichnungen sind Dinge wie Ihre öffentlichen Tweets, Blog-Beiträge und GitHub-Commits.
Indizierten Elementen kann eine Kategorie zugewiesen werden. Kategorien sind Ganzzahlen, die Datensätzen in der categories
entsprechen, die standardmäßig Folgendes enthält:
Ausweis | Name |
---|---|
1 | erstellt |
2 | gespeichert |
3 | erhalten |
created
ist für Elemente, die vom Dogsheep-Instanzbesitzer erstellt wurden.
saved
ist für Elemente, die sie gespeichert, geliked oder favorisiert haben.
received
bezieht sich auf Elemente, die von anderen Personen gezielt an sie gesendet wurden – zum Beispiel eingehende E-Mails oder Direktnachrichten.
Führen Sie datasette install dogsheep-beta
aus (oder verwenden Sie pip install dogsheep-beta
in derselben Umgebung wie Datasette), um das Dogsheep Beta Datasette-Plugin zu installieren.
Nach der Installation wird eine benutzerdefinierte Suchoberfläche unter /-/beta
zur Verfügung gestellt. Über diese Schnittstelle können Sie Suchvorgänge durchführen.
Das Datasette-Plugin verfügt über einige Konfigurationsoptionen. Sie können diese festlegen, indem Sie Folgendes zu Ihrer metadata.json
-Konfigurationsdatei hinzufügen:
{
"plugins" : {
"dogsheep-beta" : {
"database" : " beta " ,
"config_file" : " dogsheep-beta.yml " ,
"template_debug" : true
}
}
}
Die Konfigurationseinstellungen für das Plugin sind:
database
– die Datenbankdatei, die Ihren Suchindex enthält. Wenn es sich bei der Datei um beta.db
handelt, sollten Sie database
auf beta
setzen.config_file
– die YAML-Datei, die Ihre Dogsheep Beta-Konfiguration enthält.template_debug
– Setzen Sie dies auf true
, um die Debugging-Ausgabe zu aktivieren, wenn in Ihren benutzerdefinierten Vorlagen Fehler auftreten, siehe unten. Jeder indizierte Elementtyp kann benutzerdefiniertes Anzeige-HTML als Teil der Datei config.yml
definieren. Dazu kann ein display
verwendet werden, der ein Fragment der Jinja-Vorlage enthält, und optional ein display_sql
-Schlüssel mit zusätzlichem SQL, das ausgeführt werden muss, um die anzuzeigenden Daten abzurufen.
So definieren Sie eine benutzerdefinierte Anzeigevorlage für einen Tweet:
twitter.db :
tweets :
sql : |-
select
tweets.id as key,
'Tweet by @' || users.screen_name as title,
tweets.created_at as timestamp,
tweets.full_text as search_1
from tweets join users on tweets.user = users.id
display : |-
<p>{{ title }} - tweeted at {{ timestamp }}</p>
<blockquote>{{ search_1 }}</blockquote>
In diesem Beispiel wird der Wert wiederverwendet, der in der Tabelle search_index
gespeichert wurde, als die Indexierungsabfrage ausgeführt wurde.
Um zusätzliche Werte zur Anzeige in der Vorlage zu laden, verwenden Sie eine display_sql
-Abfrage wie diese:
twitter.db :
tweets :
sql : |-
select
tweets.id as key,
'Tweet by @' || users.screen_name as title,
tweets.created_at as timestamp,
tweets.full_text as search_1
from tweets join users on tweets.user = users.id
display_sql : |-
select
users.screen_name,
tweets.full_text,
tweets.created_at
from
tweets join users on tweets.user = users.id
where
tweets.id = :key
display : |-
<p>{{ display.screen_name }} - tweeted at {{ display.created_at }}</p>
<blockquote>{{ display.full_text }}</blockquote>
Die display_sql
Abfrage wird für jedes Suchergebnis ausgeführt, wobei der Schlüsselwert aus der Tabelle search_index
als Parameter :key
und der Suchbegriff des Benutzers als Parameter :q
übergeben werden.
Dies funktioniert gut, da viele kleine Abfragen in SQLite effizient sind.
Wenn beim Rendern einer Ihrer Vorlagen ein Fehler auftritt, wird auf der Suchergebnisseite ein 500-Fehler zurückgegeben. Sie können die oben beschriebene Konfigurationseinstellung template_debug
verwenden, um stattdessen Debugging-Informationen für das Suchergebniselement auszugeben, bei dem der Fehler aufgetreten ist.
Dieses Plugin wird schließlich eine Reihe nützlicher Verknüpfungen zum Rendern interessanter Inhalte enthalten.
Die erste verfügbare Verknüpfung dient der Anzeige von Karten. Gestalten Sie Ihre benutzerdefinierte Inhaltsausgabe etwa so:
< div
data-map-latitude =" {{ display.latitude }} "
data-map-longitude =" {{ display.longitude }} "
style =" display: none; float: right; width: 250px; height: 200px; background-color: #ccc; "
> </ div >
JavaScript auf der Seite sucht nach allen Elementen mit data-map-latitude
und data-map-longitude
und lädt, wenn es welche findet, Leaflet und konvertiert diese Elemente in Karten, die auf diesem Standort zentriert sind. Die Standardzoomstufe ist 12, oder Sie können ein data-map-zoom
Attribut festlegen, um dies anzupassen.
Um dieses Plugin lokal einzurichten, checken Sie zunächst den Code aus. Erstellen Sie dann eine neue virtuelle Umgebung:
cd dogsheep-beta
python3 -mvenv venv
source venv/bin/activate
Oder wenn Sie pipenv
verwenden:
pipenv shell
Installieren Sie nun die Abhängigkeiten und Tests:
pip install -e '.[test]'
So führen Sie die Tests aus:
pytest