Crie um índice de pesquisa no conteúdo de várias tabelas de banco de dados SQLite e execute pesquisas facetadas nele usando o Datasette
Um exemplo ao vivo deste plugin está sendo executado em https://datasette.io/-/beta - configurado usando este arquivo YAML.
Leia mais sobre como este exemplo funciona em Construindo um mecanismo de pesquisa para datasette.io.
Instale esta ferramenta assim:
$ pip install dogsheep-beta
Execute o indexador usando a ferramenta de linha de comando dogsheep-beta
:
$ dogsheep-beta index dogsheep.db config.yml
O arquivo config.yml
contém detalhes dos bancos de dados e tipos de documentos que devem ser indexados:
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
Isso criará uma tabela search_index
no banco de dados dogsheep.db
preenchida com dados dessas consultas SQL.
Por padrão, o índice de pesquisa criado por esta ferramenta será configurado para lematização de Porter. Isso significa que pesquisas por palavras como run
corresponderão a documentos que contenham runs
ou running
.
Se você não quiser usar a lematização de Porter, use a opção --tokenize none
:
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
Você pode passar outros argumentos de tokenização SQLite aqui, consulte a documentação dos tokenizadores SQLite FTS.
As colunas que podem ser retornadas pela nossa consulta são:
key
- uma chave primária exclusiva (dentro desse tipo)title
- o título do itemtimestamp
- um carimbo de data / hora ISO8601, por exemplo, 2020-09-02T21:00:21
search_1
- um pedaço maior de texto a ser incluído no índice de pesquisacategory
- um ID de categoria inteiro, veja abaixois_public
- um número inteiro (0 ou 1, o padrão é 0 se não for definido) especificando se é público ou nãoRegistros públicos são coisas como seus tweets públicos, postagens de blog e commits do GitHub.
Os itens indexados podem receber uma categoria. Categorias são inteiros que correspondem aos registros na tabela categories
, cujo padrão contém o seguinte:
eu ia | nome |
---|---|
1 | criado |
2 | salvo |
3 | recebido |
created
é para itens que foram criados pelo proprietário da instância Dogsheep.
saved
é para itens que eles salvaram, curtiram ou adicionaram como favoritos.
received
é para itens que foram enviados especificamente a eles por outras pessoas - e-mails recebidos ou mensagens diretas, por exemplo.
Execute datasette install dogsheep-beta
(ou use pip install dogsheep-beta
no mesmo ambiente do Datasette) para instalar o plugin Dogsheep Beta Datasette.
Depois de instalada, uma interface de pesquisa personalizada será disponibilizada em /-/beta
. Você pode usar esta interface para executar pesquisas.
O plugin Datasette possui algumas opções de configuração. Você pode defini-los adicionando o seguinte ao seu arquivo de configuração metadata.json
:
{
"plugins" : {
"dogsheep-beta" : {
"database" : " beta " ,
"config_file" : " dogsheep-beta.yml " ,
"template_debug" : true
}
}
}
As definições de configuração do plugin são:
database
- o arquivo de banco de dados que contém seu índice de pesquisa. Se o arquivo for beta.db
você deverá definir database
como beta
.config_file
- o arquivo YAML que contém a configuração do Dogsheep Beta.template_debug
- defina como true
para ativar a saída de depuração se ocorrerem erros em seus modelos personalizados, veja abaixo. Cada tipo de item indexado pode definir HTML de exibição personalizado como parte do arquivo config.yml
. Isso pode ser feito usando uma chave display
contendo um fragmento do modelo Jinja e, opcionalmente, uma chave display_sql
com SQL extra para executar para buscar os dados a serem exibidos.
Veja como definir um modelo de exibição personalizado para um 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 exemplo reutiliza o valor que foi armazenado na tabela search_index
quando a consulta de indexação foi executada.
Para carregar valores extras para exibir no modelo, use uma 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>
A consulta display_sql
será executada para cada resultado da pesquisa, passando o valor da chave da tabela search_index
como o parâmetro :key
e o termo de pesquisa do usuário como o parâmetro :q
.
Isso funciona bem porque muitas consultas pequenas são eficientes no SQLite.
Se ocorrer um erro ao renderizar um dos seus modelos, a página de resultados da pesquisa retornará um erro 500. Você pode usar a definição de configuração template_debug
descrita acima para gerar informações de depuração para o item de resultados de pesquisa que apresentou o erro.
Este plugin eventualmente incluirá uma série de atalhos úteis para renderizar conteúdo interessante.
O primeiro atalho disponível é para exibir mapas. Faça com que sua saída de conteúdo personalizada seja algo assim:
< div
data-map-latitude =" {{ display.latitude }} "
data-map-longitude =" {{ display.longitude }} "
style =" display: none; float: right; width: 250px; height: 200px; background-color: #ccc; "
> </ div >
O JavaScript na página procurará quaisquer elementos com data-map-latitude
e data-map-longitude
e, se encontrar algum, carregará o Leaflet e converterá esses elementos em mapas centrados naquele local. O nível de zoom padrão será 12, ou você pode definir um atributo data-map-zoom
para personalizar isso.
Para configurar este plugin localmente, primeiro verifique o código. Em seguida, crie um novo ambiente virtual:
cd dogsheep-beta
python3 -mvenv venv
source venv/bin/activate
Ou se você estiver usando pipenv
:
pipenv shell
Agora instale as dependências e testes:
pip install -e '.[test]'
Para executar os testes:
pytest