在多个 SQLite 数据库表中构建一个内容搜索索引,并使用 Datasette 对其运行分面搜索
此插件的实时示例正在 https://datasette.com.cn/-/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
这将创建一个 search_index
表在 dogsheep.db
数据库中,其中填充了来自那些 SQL 查询的数据。
默认情况下,此工具创建的搜索索引将配置为 Porter 词干提取。这意味着搜索 run
这样的词将匹配包含 runs
或 running
的文档。
如果您不想使用 Porter 词干提取,请使用 --tokenize none
选项
$ dogsheep-beta index dogsheep.db config.yml --tokenize none
您可以在此处传递其他 SQLite 分词参数,请参阅 SQLite FTS 分词器文档。
我们的查询可以返回的列是
key
- 一个唯一的(在该类型内)主键title
- 项目的标题timestamp
- 一个 ISO8601 时间戳,例如2020-09-02T21:00:21
search_1
- 包含在搜索索引中的较大文本块category
- 一个整数类别 ID,见下文is_public
- 一个整数(0 或 1,如果未设置默认为 0),指定这是否是公开的
公开记录是您公开的推文、博客文章和 GitHub 提交等内容。
索引的项目可以分配一个类别。类别是对应于 categories
表中记录的整数,该表默认为包含以下内容
id | name |
---|---|
1 | created |
2 | saved |
3 | received |
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
以在自定义模板中发生错误时启用调试输出,见下文。
每个索引的项目类型可以在 config.yml
文件中定义自定义显示 HTML。它可以使用包含 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: |-
{{ title }} - tweeted at {{ timestamp }}
{{ search_1 }}
此示例重用了运行索引查询时存储在 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: |-
{{ display.screen_name }} - tweeted at {{ display.created_at }}
{{ display.full_text }}
对于每个搜索结果,将执行 display_sql
查询,将来自 search_index
表的 key 值作为 :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>