跨多个 SQLite 数据库表的内容构建搜索索引,并使用 Datasette 对其运行分面搜索
该插件的实时示例在 https://datasette.io/-/beta 上运行 - 使用此 YAML 文件进行配置。
详细了解此示例的工作原理,请参阅为 datasette.io 构建搜索引擎。
像这样安装这个工具:
$ pip install dogsheep-beta
使用dogsheep-beta
命令行工具运行索引器:
$ dogsheep-beta index dogsheep.db config.yml
config.yml
文件包含应索引的数据库和文档类型的详细信息:
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
这将在dogsheep.db
数据库中创建一个search_index
表,其中填充来自这些 SQL 查询的数据。
默认情况下,该工具创建的搜索索引将配置为 Porter 词干。这意味着搜索run
这样的单词将匹配包含runs
或running
文档。
如果您不想使用 Porter 词干分析,请使用--tokenize none
选项:
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
您可以在此处传递其他 SQLite tokenize 参数,请参阅 SQLite FTS tokenizers 文档。
我们的查询可以返回的列是:
key
- 唯一的(在该类型内)主键title
- 项目的标题timestamp
- ISO8601 时间戳,例如2020-09-02T21:00:21
search_1
- 要包含在搜索索引中的较大文本块category
- 整数类别ID,见下文is_public
- 一个整数(0 或 1,如果未设置则默认为 0),指定这是否是公共的公共记录是指您的公开推文、博客文章和 GitHub 提交等内容。
可以为索引项目分配一个类别。类别是与categories
表中的记录相对应的整数,默认包含以下内容:
ID | 姓名 |
---|---|
1 | 已创建 |
2 | 已保存 |
3 | 已收到 |
created
是由 Dogsheep 实例所有者创建的项目。
saved
是指他们已保存、喜欢或收藏的项目。
received
是其他人专门发送给他们的项目 - 例如传入的电子邮件或直接消息。
运行datasette install dogsheep-beta
(或在与 Datasette 相同的环境中使用pip install dogsheep-beta
)来安装 Dogsheep Beta Datasette 插件。
安装后,将在/-/beta
上提供自定义搜索界面。您可以使用此界面来执行搜索。
Datasette 插件有一些配置选项。您可以通过将以下内容添加到metadata.json
配置文件来设置这些:
{
"plugins" : {
"dogsheep-beta" : {
"database" : " beta " ,
"config_file" : " dogsheep-beta.yml " ,
"template_debug" : true
}
}
}
该插件的配置设置为:
database
- 包含搜索索引的数据库文件。如果文件是beta.db
您应该将database
设置为beta
。config_file
- 包含 Dogsheep Beta 配置的 YAML 文件。template_debug
- 将其设置为true
以在自定义模板中发生错误时启用调试输出,请参见下文。 每个索引项类型都可以将自定义显示 HTML 定义为config.yml
文件的一部分。它可以使用包含 Jinja 模板片段的display
键以及可选的带有额外 SQL 的display_sql
键来执行此操作以获取要显示的数据。
以下是如何为推文定义自定义显示模板:
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>
此示例重用运行索引查询时存储在search_index
表中的值。
要加载额外的值以在模板中显示,请使用如下所示的display_sql
查询:
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>
将对每个搜索结果执行display_sql
查询,将search_index
表中的键值作为:key
参数传递,将用户的搜索词作为:q
参数传递。
这执行得很好,因为许多小型查询在 SQLite 中都很高效。
如果呈现模板之一时发生错误,搜索结果页面将返回 500 错误。您可以使用上述template_debug
配置设置来输出出现错误的搜索结果项的调试信息。
该插件最终将包含许多有用的快捷方式来呈现有趣的内容。
第一个可用的快捷方式用于显示地图。使您的自定义内容输出如下所示:
< 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 将查找具有data-map-latitude
和data-map-longitude
的任何元素,如果找到任何元素,将加载 Leaflet 并将这些元素转换为以该位置为中心的地图。默认缩放级别为 12,或者您可以设置data-map-zoom
属性来自定义此级别。
要在本地设置此插件,请首先检查代码。然后创建一个新的虚拟环境:
cd dogsheep-beta
python3 -mvenv venv
source venv/bin/activate
或者如果您使用的是pipenv
:
pipenv shell
现在安装依赖项和测试:
pip install -e '.[test]'
运行测试:
pytest