加速建索引

This commit is contained in:
gotoeasy 2024-07-29 17:23:54 +08:00
parent a8de6aee42
commit f8be2558b8
2 changed files with 19 additions and 14 deletions

View File

@ -51,6 +51,7 @@ var minioPassword string
var minioBucket string
var enableUploadMinio bool
var goMaxProcess int
var goMaxProcessIdx int
var enableCors bool
var pageSize int
var nearSearchSize int
@ -61,7 +62,6 @@ var aryWhite []string
var aryBlack []string
var ipAddCity bool
var enableChatAi bool
var createIndexSync bool
func init() {
UpdateConfigByEnv()
@ -101,18 +101,13 @@ func UpdateConfigByEnv() {
minioBucket = cmn.GetEnvStr("GLC_MINIO_BUCKET", "") // 【X】MINIO桶名默认“”
enableUploadMinio = cmn.GetEnvBool("GLC_ENABLE_UPLOAD_MINIO", false) // 【X】是否开启上传备份至MINIO服务器默认false
goMaxProcess = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS", -1)) // 使用的最大CPU数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
goMaxProcessIdx = getGoMaxProcessConf(cmn.GetEnvInt("GLC_GOMAXPROCS_IDX", -1)) // 创建索引使用的最大协程数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
enableCors = cmn.GetEnvBool("GLC_ENABLE_CORS", false) // 是否允许跨域默认false
pageSize = getPageSizeConf(cmn.GetEnvInt("GLC_PAGE_SIZE", 100)) // 每次检索件数默认100有效范围1~1000
nearSearchSize = getNearSearchSizeConf(cmn.GetEnvInt("GLC_NEAR_SEARCH_SIZE", 200)) // 定位相邻检索的查询件数默认200有效范围50~1000
mulitLineSearch = cmn.GetEnvBool("GLC_SEARCH_MULIT_LINE", false) // 是否检索日志的全部行日志可能有换行默认false仅第一行
testMode = cmn.GetEnvBool("GLC_TEST_MODE", false) // 是否测试模式默认false
enableChatAi = cmn.GetEnvBool("GLC_ENABLE_CHATAI", true) // 是否开启GLC智能助手默认true
createIndexSync = cmn.GetEnvBool("GLC_CREATE_INDEX_SYNC", false) // 是否同步创建索引默认false
}
// 取配置: 是否同步创建索引
func IsCreateIndexSync() bool {
return createIndexSync
}
// 取配置: 是否开启GLC智能助手
@ -188,6 +183,11 @@ func IsEnableCors() bool {
return enableCors
}
// 取配置: 创建索引使用的最大协程数量默认是最大CPU数量设定值不在实际数量范围是按最大看待
func GetGoMaxProcessIdx() int {
return goMaxProcessIdx
}
// 取配置: 使用的最大CPU数量可通过环境变量“GLC_GOMAXPROCS”设定默认最大CPU数量
func GetGoMaxProcess() int {
return goMaxProcess

View File

@ -34,6 +34,8 @@ type LogDataStorage struct {
closing bool // 是否关闭中状态
mu sync.Mutex // 锁
wg sync.WaitGroup // 计数
muIdx sync.Mutex // 建索引锁
}
var zeroUint32Bytes []byte = cmn.Uint32ToBytes(0)
@ -133,12 +135,11 @@ func (s *LogDataStorage) readyGo() {
break
}
s.saveLogData(data) // 保存日志数据
if conf.IsCreateIndexSync() {
s.createInvertedIndex() // 按配置要求同步生成反向索引
}
default:
// 空时再生成索引,一次一条日志,有空则生成直到全部完成
// 空时再生成索引,多协程跑起来加快速度,再来一次单条同步用于判断,有空则生成直到全部完成
for i := 0; i < conf.GetGoMaxProcessIdx()-1; i++ {
go s.createInvertedIndex() // 多协程跑起来加快速度
}
n := s.createInvertedIndex() // 生成反向索引
// 索引生成完成后,等待接收保存日志
@ -178,17 +179,21 @@ func (s *LogDataStorage) saveLogData(model *LogDataModel) {
// 创建日志索引(一次建一条日志的索引),没有可建索引时返回0
func (s *LogDataStorage) createInvertedIndex() int {
s.muIdx.Lock() // 索引锁,建索引略需时间,手动控制不做全称锁
// 索引信息和日志数量相互比较,判断是否继续创建索引
if s.TotalCount() == 0 || s.indexedCount >= s.TotalCount() {
s.muIdx.Unlock()
return 0 // 没有新的日志需要建索引
}
s.indexedCount++ // 下一条要建索引的日志id
docm, err := s.GetLogDataModel(s.indexedCount) // 取出日志模型数据
docm, err := s.GetLogDataModel(s.indexedCount + 1) // 取出日志模型数据
if err != nil {
s.muIdx.Unlock()
cmn.Error("取日志模型数据失败:", s.indexedCount, err)
return 2
}
s.indexedCount++ // 下一条要建索引的日志id
s.muIdx.Unlock()
// 整理生成关键词
var adds []string