mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-23 23:16:50 +00:00
整理lib目录
This commit is contained in:
104
lib/plugins/algolia.js
Normal file
104
lib/plugins/algolia.js
Normal file
@@ -0,0 +1,104 @@
|
||||
import BLOG from '@/blog.config'
|
||||
import { getPageContentText } from '@/pages/search/[keyword]'
|
||||
import algoliasearch from 'algoliasearch'
|
||||
|
||||
/**
|
||||
* 生成全文索引
|
||||
* @param {*} allPages
|
||||
*/
|
||||
const generateAlgoliaSearch = async({ allPages, force = false }) => {
|
||||
allPages?.forEach(p => {
|
||||
// 判断这篇文章是否需要重新创建索引
|
||||
if (p && !p.password) {
|
||||
uploadDataToAlgolia(p)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传数据
|
||||
* 根据上次修改文章日期和上次更新索引数据判断是否需要更新algolia索引
|
||||
*/
|
||||
const uploadDataToAlgolia = async(post) => {
|
||||
// Connect and authenticate with your Algolia app
|
||||
const client = algoliasearch(BLOG.ALGOLIA_APP_ID, BLOG.ALGOLIA_ADMIN_APP_KEY)
|
||||
|
||||
// Create a new index and add a record
|
||||
const index = client.initIndex(BLOG.ALGOLIA_INDEX)
|
||||
|
||||
if (!post) {
|
||||
return
|
||||
}
|
||||
|
||||
// 检查是否有索引
|
||||
let existed
|
||||
let needUpdateIndex = false
|
||||
try {
|
||||
existed = await index.getObject(post.id)
|
||||
} catch (error) {
|
||||
// 通常是不存在索引
|
||||
}
|
||||
|
||||
if (!existed || !existed?.lastEditedDate || !existed?.lastIndexDate) {
|
||||
needUpdateIndex = true
|
||||
} else {
|
||||
const lastEditedDate = new Date(post.lastEditedDate)
|
||||
const lastIndexDate = new Date(existed.lastIndexDate)
|
||||
if (lastEditedDate.getTime() > lastIndexDate.getTime()) {
|
||||
needUpdateIndex = true
|
||||
}
|
||||
}
|
||||
|
||||
// 如果需要更新搜索
|
||||
if (needUpdateIndex) {
|
||||
const record = {
|
||||
objectID: post.id,
|
||||
title: post.title,
|
||||
category: post.category,
|
||||
tags: post.tags,
|
||||
pageCover: post.pageCover,
|
||||
slug: post.slug,
|
||||
summary: post.summary,
|
||||
lastEditedDate: post.lastEditedDate, // 更新文章时间
|
||||
lastIndexDate: new Date(), // 更新索引时间
|
||||
content: truncate(getPageContentText(post, post.blockMap), 9000) // 索引9000个字节,因为api限制总请求内容上限1万个字节
|
||||
}
|
||||
// console.log('更新Algolia索引', record)
|
||||
index.saveObject(record).wait().then(r => {
|
||||
console.log('Algolia索引更新', r)
|
||||
}).catch(err => {
|
||||
console.log('Algolia异常', err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 限制内容字节数
|
||||
* @param {*} str
|
||||
* @param {*} maxBytes
|
||||
* @returns
|
||||
*/
|
||||
function truncate(str, maxBytes) {
|
||||
let count = 0
|
||||
let result = ''
|
||||
for (let i = 0; i < str.length; i++) {
|
||||
const code = str.charCodeAt(i)
|
||||
if (code <= 0x7f) {
|
||||
count += 1
|
||||
} else if (code <= 0x7ff) {
|
||||
count += 2
|
||||
} else if (code <= 0xffff) {
|
||||
count += 3
|
||||
} else {
|
||||
count += 4
|
||||
}
|
||||
if (count <= maxBytes) {
|
||||
result += str[i]
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export { uploadDataToAlgolia, generateAlgoliaSearch }
|
||||
Reference in New Issue
Block a user