跨多個 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