Créez un index de recherche sur le contenu de plusieurs tables de base de données SQLite et exécutez des recherches à facettes sur celui-ci à l'aide de Datasette.
Un exemple en direct de ce plugin est exécuté sur https://datasette.io/-/beta - configuré à l'aide de ce fichier YAML.
En savoir plus sur le fonctionnement de cet exemple dans Création d'un moteur de recherche pour datasette.io.
Installez cet outil comme ceci :
$ pip install dogsheep-beta
Exécutez l'indexeur à l'aide de l'outil de ligne de commande dogsheep-beta
:
$ dogsheep-beta index dogsheep.db config.yml
Le fichier config.yml
contient des détails sur les bases de données et les types de documents qui doivent être indexés :
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
Cela créera une table search_index
dans la base de données dogsheep.db
remplie par les données de ces requêtes SQL.
Par défaut, l'index de recherche créé par cet outil sera configuré pour la racine Porter. Cela signifie que les recherches de mots comme run
correspondront aux documents contenant runs
ou running
.
Si vous ne souhaitez pas utiliser le radical Porter, utilisez l'option --tokenize none
:
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
Vous pouvez transmettre d'autres arguments de tokenisation SQLite ici, voir la documentation des tokenizers SQLite FTS.
Les colonnes pouvant être renvoyées par notre requête sont :
key
- une clé primaire unique (au sein de ce type)title
- le titre de l'élémenttimestamp
- un horodatage ISO8601, par exemple 2020-09-02T21:00:21
search_1
- une plus grande partie du texte à inclure dans l'index de recherchecategory
- un identifiant de catégorie entier, voir ci-dessousis_public
- un entier (0 ou 1, par défaut 0 s'il n'est pas défini) spécifiant s'il est public ou nonLes enregistrements publics sont des éléments tels que vos tweets publics, vos articles de blog et vos commits GitHub.
Les éléments indexés peuvent se voir attribuer une catégorie. Les catégories sont des entiers qui correspondent aux enregistrements de la table categories
, qui contient par défaut les éléments suivants :
identifiant | nom |
---|---|
1 | créé |
2 | enregistré |
3 | reçu |
created
concerne les éléments qui ont été créés par le propriétaire de l'instance Dogsheep.
saved
concerne les éléments qu'ils ont enregistrés, aimés ou favoris.
received
concerne les éléments qui leur ont été spécifiquement envoyés par d'autres personnes - des e-mails entrants ou des messages directs par exemple.
Exécutez datasette install dogsheep-beta
(ou utilisez pip install dogsheep-beta
dans le même environnement que Datasette) pour installer le plugin Dogsheep Beta Datasette.
Une fois installée, une interface de recherche personnalisée sera disponible sur /-/beta
. Vous pouvez utiliser cette interface pour exécuter des recherches.
Le plugin Datasette propose quelques options de configuration. Vous pouvez les définir en ajoutant les éléments suivants à votre fichier de configuration metadata.json
:
{
"plugins" : {
"dogsheep-beta" : {
"database" : " beta " ,
"config_file" : " dogsheep-beta.yml " ,
"template_debug" : true
}
}
}
Les paramètres de configuration du plugin sont :
database
- le fichier de base de données qui contient votre index de recherche. Si le fichier est beta.db
vous devez définir database
sur beta
.config_file
- le fichier YAML contenant votre configuration Dogsheep Beta.template_debug
- définissez ceci sur true
pour activer la sortie de débogage si des erreurs se produisent dans vos modèles personnalisés, voir ci-dessous. Chaque type d'élément indexé peut définir un affichage HTML personnalisé dans le cadre du fichier config.yml
. Il peut le faire en utilisant une clé display
contenant un fragment du modèle Jinja et éventuellement une clé display_sql
avec du SQL supplémentaire à exécuter pour récupérer les données à afficher.
Voici comment définir un modèle d'affichage personnalisé pour un 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>
Cet exemple réutilise la valeur stockée dans la table search_index
lors de l'exécution de la requête d'indexation.
Pour charger des valeurs supplémentaires à afficher dans le modèle, utilisez une requête display_sql
comme celle-ci :
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>
La requête display_sql
sera exécutée pour chaque résultat de recherche, en transmettant la valeur clé de la table search_index
comme paramètre :key
et le terme de recherche de l'utilisateur comme paramètre :q
.
Cela fonctionne bien car de nombreuses petites requêtes sont efficaces dans SQLite.
Si une erreur se produit lors du rendu de l'un de vos modèles, la page de résultats de recherche renverra une erreur 500. Vous pouvez utiliser le paramètre de configuration template_debug
décrit ci-dessus pour afficher à la place des informations de débogage pour l'élément de résultats de recherche qui a rencontré l'erreur.
Ce plugin inclura à terme un certain nombre de raccourcis utiles pour restituer du contenu intéressant.
Le premier raccourci disponible permet d'afficher des cartes. Faites en sorte que votre contenu personnalisé ressemble à ceci :
< 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 sur la page recherchera tous les éléments avec data-map-latitude
et data-map-longitude
et, s'il en trouve, chargera Leaflet et convertira ces éléments en cartes centrées sur cet emplacement. Le niveau de zoom par défaut sera de 12, ou vous pouvez définir un attribut data-map-zoom
pour le personnaliser.
Pour configurer ce plugin localement, commencez par extraire le code. Créez ensuite un nouvel environnement virtuel :
cd dogsheep-beta
python3 -mvenv venv
source venv/bin/activate
Ou si vous utilisez pipenv
:
pipenv shell
Installez maintenant les dépendances et les tests :
pip install -e '.[test]'
Pour exécuter les tests :
pytest