Cree un índice de búsqueda entre el contenido de varias tablas de bases de datos SQLite y ejecute búsquedas por facetas utilizando Datasette.
Se ejecuta un ejemplo en vivo de este complemento en https://datasette.io/-/beta, configurado con este archivo YAML.
Lea más sobre cómo funciona este ejemplo en Creación de un motor de búsqueda para datasette.io.
Instale esta herramienta así:
$ pip install dogsheep-beta
Ejecute el indexador utilizando la herramienta de línea de comandos dogsheep-beta
:
$ dogsheep-beta index dogsheep.db config.yml
El archivo config.yml
contiene detalles de las bases de datos y tipos de documentos que deben indexarse:
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
Esto creará una tabla search_index
en la base de datos dogsheep.db
poblada por datos de esas consultas SQL.
De forma predeterminada, el índice de búsqueda que crea esta herramienta se configurará para la derivación de Porter. Esto significa que las búsquedas de palabras como run
coincidirán con documentos que contengan runs
o running
.
Si no desea utilizar la derivación de Porter, utilice la opción --tokenize none
:
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
Puede pasar otros argumentos de tokenización de SQLite aquí; consulte la documentación de tokenizadores de SQLite FTS.
Las columnas que puede devolver nuestra consulta son:
key
: una clave primaria única (dentro de ese tipo)title
: el título del artículotimestamp
: una marca de tiempo ISO8601, por ejemplo, 2020-09-02T21:00:21
search_1
: una porción más grande de texto que se incluirá en el índice de búsquedacategory
: un ID de categoría entero, ver más abajois_public
: un número entero (0 o 1, el valor predeterminado es 0 si no está configurado) que especifica si es público o no.Los registros públicos son cosas como tus tweets públicos, publicaciones de blog y confirmaciones de GitHub.
A los elementos indexados se les puede asignar una categoría. Las categorías son números enteros que corresponden a registros en la tabla categories
, que de forma predeterminada contiene lo siguiente:
identificación | nombre |
---|---|
1 | creado |
2 | salvado |
3 | recibió |
created
es para elementos que han sido creados por el propietario de la instancia Dogsheep.
saved
es para elementos que han guardado, que les han gustado o favoritos.
received
son para elementos que otras personas les han enviado específicamente (correos electrónicos entrantes o mensajes directos, por ejemplo).
Ejecute datasette install dogsheep-beta
(o use pip install dogsheep-beta
en el mismo entorno que Datasette) para instalar el complemento Dogsheep Beta Datasette.
Una vez instalado, una interfaz de búsqueda personalizada estará disponible en /-/beta
. Puede utilizar esta interfaz para ejecutar búsquedas.
El complemento Datasette tiene algunas opciones de configuración. Puede configurarlos agregando lo siguiente a su archivo de configuración metadata.json
:
{
"plugins" : {
"dogsheep-beta" : {
"database" : " beta " ,
"config_file" : " dogsheep-beta.yml " ,
"template_debug" : true
}
}
}
Los ajustes de configuración del complemento son:
database
: el archivo de base de datos que contiene su índice de búsqueda. Si el archivo es beta.db
debe configurar database
en beta
.config_file
: el archivo YAML que contiene su configuración Beta de Dogsheep.template_debug
: configúrelo en true
para habilitar la salida de depuración si se producen errores en sus plantillas personalizadas, consulte a continuación. Cada tipo de elemento indexado puede definir HTML de visualización personalizado como parte del archivo config.yml
. Puede hacer esto usando una clave display
que contiene un fragmento de la plantilla de Jinja y, opcionalmente, una clave display_sql
con SQL adicional para ejecutar para recuperar los datos que se mostrarán.
A continuación se explica cómo definir una plantilla de visualización personalizada para 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>
Este ejemplo reutiliza el valor que se almacenó en la tabla search_index
cuando se ejecutó la consulta de indexación.
Para cargar valores adicionales para mostrar en la plantilla, use una consulta display_sql
como esta:
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 consulta display_sql
se ejecutará para cada resultado de búsqueda, pasando el valor clave de la tabla search_index
como el parámetro :key
y el término de búsqueda del usuario como el parámetro :q
.
Esto funciona bien porque muchas consultas pequeñas son eficientes en SQLite.
Si se produce un error al renderizar una de sus plantillas, la página de resultados de búsqueda devolverá un error 500. Puede utilizar la configuración template_debug
descrita anteriormente para generar información de depuración para el elemento de resultados de búsqueda que experimentó el error.
Este complemento eventualmente incluirá una serie de atajos útiles para mostrar contenido interesante.
El primer atajo disponible es para mostrar mapas. Haga que su contenido personalizado genere algo como esto:
< 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 en la página buscará cualquier elemento con data-map-latitude
y data-map-longitude
y, si encuentra alguno, cargará el Folleto y convertirá esos elementos en mapas centrados en esa ubicación. El nivel de zoom predeterminado será 12, o puede configurar un atributo data-map-zoom
para personalizarlo.
Para configurar este complemento localmente, primero consulte el código. Luego cree un nuevo entorno virtual:
cd dogsheep-beta
python3 -mvenv venv
source venv/bin/activate
O si estás usando pipenv
:
pipenv shell
Ahora instale las dependencias y pruebas:
pip install -e '.[test]'
Para ejecutar las pruebas:
pytest