Создайте индекс поиска по содержимому из нескольких таблиц базы данных 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
Это создаст таблицу search_index
в базе данных dogsheep.db
заполненную данными из этих запросов SQL.
По умолчанию индекс поиска, создаваемый этим инструментом, будет настроен для стемминга по Портеру. Это означает, что поиск по таким словам, как 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
- целочисленный идентификатор категории, см. ниже.is_public
— целое число (0 или 1, по умолчанию 0, если не установлено), определяющее, является ли оно общедоступным или нет.Публичные записи — это ваши публичные твиты, сообщения в блогах и коммиты GitHub.
Индексированным элементам можно присвоить категорию. Категории — это целые числа, соответствующие записям в таблице categories
, которая по умолчанию содержит следующее:
идентификатор | имя |
---|---|
1 | созданный |
2 | сохранено |
3 | полученный |
created
предназначен для элементов, созданных владельцем экземпляра Dogsheep.
saved
— для элементов, которые они сохранили, поставили «Нравится» или добавили в избранное.
received
относится к элементам, которые были специально отправлены им другими людьми — например, входящим электронным письмам или личным сообщениям.
Запустите datasette install dogsheep-beta
(или используйте pip install dogsheep-beta
в той же среде, что и Datasette), чтобы установить плагин 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
— файл YAML, содержащий вашу бета-конфигурацию Dogsheep.template_debug
— установите для этого параметра значение true
, чтобы включить вывод отладки в случае возникновения ошибок в ваших пользовательских шаблонах, см. ниже. Каждый тип индексированного элемента может определять собственный HTML-код отображения как часть файла config.yml
. Это можно сделать с помощью ключа display
, содержащего фрагмент шаблона Jinja, и, при необходимости, ключа display_sql
с дополнительным 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