dogsheep-beta 作者 dogsheep

加星

README 源代码

dogsheep-beta

PyPI Changelog Tests License

在多个 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 这样的词将匹配包含 runsrunning 的文档。

如果您不想使用 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 插件

运行 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>

页面上的 JavaScript 将查找任何带有 data-map-latitudedata-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