一篇简短的笔记,为 Misskey 开启 Meilisearch 后,重新索引过去的帖子。
首先编写这样一个 SQL 文件
SELECT json_agg(row_to_json(n.*)) FROM (
SELECT "id", "userId", "channelId", "cw", "text", "tags"
FROM "note"
WHERE ("note"."visibility" = 'public' OR "note"."visibility" = 'home') AND
("note"."text" IS NOT NULL) AND
("note"."uri" IS NULL)
ORDER BY id desc
) n
我们不妨保存它为 get_notes.sql
这个 SQL 的意思很显然,就是从帖子表中找到 public
或 home
可见性的本地帖子 (uri is null
) 并输出成 JSON
然后执行它,得到一个 notes.json
psql -d {your_db_name} -t -f get_notes.sql > notes.json
然后创建一个 send_notes.mjs
。最前方的 config 请用你的 misskey 的 .config/default.yml
内关于 Meilisearch 的部分替换。
import fs from "fs";
const config = {
ms_url: "http://127.0.0.1:7700",
api_key: "YOUR_API_KEY",
index: "YOUR_INDEX",
};
const headers = {
"Content-Type": "application/json",
Authorization: `Bearer ${config.api_key}`,
};
/** @typedef {{id: string, userId: string, channelId: string, cw: string | null, text: string, tags: string[]}} {Note} */
/** @type {Note[]} */
const notes = JSON.parse(fs.readFileSync("notes.json"));
/**
* @see https://github.com/misskey-dev/misskey/blob/4b295088fd6b4bead05087537415b10419eee78f/packages/backend/src/misc/id/aid.ts#L34
*/
function parseAid(id) {
const TIME2000 = 946684800000;
const time = parseInt(id.slice(0, 8), 36) + TIME2000;
return time;
}
for (const note of notes) {
note.createdAt = parseAid(note.id);
note.userHost = null;
}
console.log("Reindexing", notes.length, "notes");
fetch(
config.ms_url + `/indexes/${config.index}---notes/documents?primaryKey=id`,
{
method: "POST",
headers,
body: JSON.stringify(notes),
}
)
.then((res) => res.text())
.then((text) => {
console.log(text);
});
执行 node send_note.mjs
, 如果成功把帖子送给了 Meilisearch 进行索引,我们应该能看到像这样的输出内容:
{
"taskUid": 9241,
"indexUid": "shonk_social---notes",
"status": "enqueued",
"type": "documentAdditionOrUpdate",
"enqueuedAt": "2024-09-07T06:31:44.177026811Z"
}
如果要查看索引进度,记下 taskUid
。使用像这样命令就可以查看索引进度了:
curl -s 'http://localhost:7700/tasks/{taskUid}' -H "Authorization: Bearer {your_api_key}" | jq .