diff --git a/glc/conf/config.go b/glc/conf/config.go index d5fcefb..2703528 100644 --- a/glc/conf/config.go +++ b/glc/conf/config.go @@ -53,6 +53,7 @@ var enableUploadMinio bool var goMaxProcess int var enableCors bool var pageSize int +var nearSearchSize int var mulitLineSearch bool var testMode bool var tokenSalt string @@ -66,42 +67,48 @@ func init() { func UpdateConfigByEnv() { // 读取环境变量初始化配置,各配置都有默认值 - storeChanLength = cmn.GetEnvInt("GLC_STORE_CHAN_LENGTH", 64) // 【X】存储通道长度 - maxIdleTime = cmn.GetEnvInt("GLC_MAX_IDLE_TIME", 300) // 【X】最大闲置时间(秒),超过闲置时间将自动关闭,0时表示不关闭 - storeNameAutoAddDate = cmn.GetEnvBool("GLC_STORE_NAME_AUTO_ADD_DATE", true) // 存储名是否自动添加日期(日志量大通常按日单位区分存储),默认true - serverUrl = cmn.GetEnvStr("GLC_SERVER_URL", "") // 服务URL,默认“”,集群配置时自动获取地址可能不对,可通过这个设定 - serverIp = cmn.GetEnvStr("GLC_SERVER_IP", "") // 【X】服务IP,默认“”,当“”时会自动获取 - enableSecurityKey = cmn.GetEnvBool("GLC_ENABLE_SECURITY_KEY", false) // web服务是否开启API秘钥校验,默认false - headerSecurityKey = cmn.GetEnvStr("GLC_HEADER_SECURITY_KEY", "X-GLC-AUTH") // web服务API秘钥的header键名 - securityKey = cmn.GetEnvStr("GLC_SECURITY_KEY", "glogcenter") // web服务API秘钥 - enableWebGzip = cmn.GetEnvBool("GLC_ENABLE_WEB_GZIP", false) // web服务是否开启Gzip - enableAmqpConsume = cmn.GetEnvBool("GLC_ENABLE_AMQP_CONSUME", false) // 是否开启rabbitMq消费者接收日志 - amqpAddr = cmn.GetEnvStr("GLC_AMQP_ADDR", "") // rabbitMq连接地址,例:"amqp://user:password@ip:port/" - amqpQueueName = cmn.GetEnvStr("GLC_AMQP_QUEUE_NAME", "glc-log-queue") // rabbitMq队列名 - amqpJsonFormat = cmn.GetEnvBool("GLC_AMQP_JSON_FORMAT", true) // rabbitMq消息文本是否为json格式,默认true - saveDays = cmn.GetEnvInt("GLC_SAVE_DAYS", 180) // 日志分仓时的保留天数(0~1200),0表示不自动删除,默认180天 - enableLogin = cmn.GetEnvBool("GLC_ENABLE_LOGIN", false) // 是否开启用户密码登录,默认“false” - sessionTimeout = cmn.GetEnvInt("GLC_SESSION_TIMEOUT", 30) // 登录会话超时时间,默认“30”分钟 - username = cmn.GetEnvStr("GLC_USERNAME", "glc") // 登录用户名,默认“glc” - password = cmn.GetEnvStr("GLC_PASSWORD", "GLogCenter100%666") // 登录密码,默认“GLogCenter100%666” - tokenSalt = cmn.GetEnvStr("GLC_TOKEN_SALT", "") // 令牌盐,默认“” - aryWhite = cmn.Split(cmn.GetEnvStr("GLC_WHITE_LIST", ""), ",") // IP或区域白名单,逗号分隔,默认“” - aryBlack = cmn.Split(cmn.GetEnvStr("GLC_BLACK_LIST", ""), ",") // IP或区域黑名单,逗号分隔,单个*代表全部,内网地址不受限制,默认“” - ipAddCity = cmn.GetEnvBool("GLC_IP_ADD_CITY", false) // IP是否要自动附加城市信息,默认false - clusterMode = cmn.GetEnvBool("GLC_CLUSTER_MODE", false) // 是否开启集群模式,默认false - splitUrls(cmn.GetEnvStr("GLC_CLUSTER_URLS", "")) // 从服务器地址,多个时逗号分开,默认“” - enableBackup = cmn.GetEnvBool("GLC_ENABLE_BACKUP", false) // 【X】是否开启备份,默认false - glcGroup = cmn.GetEnvStr("GLC_GROUP", "default") // 【X】日志中心分组名,默认“default” - minioUrl = cmn.GetEnvStr("GLC_MINIO_URL", "") // 【X】MINIO地址,默认“” - minioUser = cmn.GetEnvStr("GLC_MINIO_USER", "") // 【X】MINIO用户名,默认“” - minioPassword = cmn.GetEnvStr("GLC_MINIO_PASS", "") // 【X】MINIO密码,默认“” - 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数量(设定值不在实际数量范围是按最大看待) - enableCors = cmn.GetEnvBool("GLC_ENABLE_CORS", false) // 是否允许跨域,默认false - pageSize = getPageSizeConf(cmn.GetEnvInt("GLC_PAGE_SIZE", 100)) // 每次检索件数,默认100(有效范围1~1000) - mulitLineSearch = cmn.GetEnvBool("GLC_SEARCH_MULIT_LINE", false) // 是否检索日志的全部行(日志可能有换行),默认false仅第一行 - testMode = cmn.GetEnvBool("GLC_TEST_MODE", false) // 是否测试模式,默认false + storeChanLength = cmn.GetEnvInt("GLC_STORE_CHAN_LENGTH", 64) // 【X】存储通道长度 + maxIdleTime = cmn.GetEnvInt("GLC_MAX_IDLE_TIME", 300) // 【X】最大闲置时间(秒),超过闲置时间将自动关闭,0时表示不关闭 + storeNameAutoAddDate = cmn.GetEnvBool("GLC_STORE_NAME_AUTO_ADD_DATE", true) // 存储名是否自动添加日期(日志量大通常按日单位区分存储),默认true + serverUrl = cmn.GetEnvStr("GLC_SERVER_URL", "") // 服务URL,默认“”,集群配置时自动获取地址可能不对,可通过这个设定 + serverIp = cmn.GetEnvStr("GLC_SERVER_IP", "") // 【X】服务IP,默认“”,当“”时会自动获取 + enableSecurityKey = cmn.GetEnvBool("GLC_ENABLE_SECURITY_KEY", false) // web服务是否开启API秘钥校验,默认false + headerSecurityKey = cmn.GetEnvStr("GLC_HEADER_SECURITY_KEY", "X-GLC-AUTH") // web服务API秘钥的header键名 + securityKey = cmn.GetEnvStr("GLC_SECURITY_KEY", "glogcenter") // web服务API秘钥 + enableWebGzip = cmn.GetEnvBool("GLC_ENABLE_WEB_GZIP", false) // web服务是否开启Gzip + enableAmqpConsume = cmn.GetEnvBool("GLC_ENABLE_AMQP_CONSUME", false) // 是否开启rabbitMq消费者接收日志 + amqpAddr = cmn.GetEnvStr("GLC_AMQP_ADDR", "") // rabbitMq连接地址,例:"amqp://user:password@ip:port/" + amqpQueueName = cmn.GetEnvStr("GLC_AMQP_QUEUE_NAME", "glc-log-queue") // rabbitMq队列名 + amqpJsonFormat = cmn.GetEnvBool("GLC_AMQP_JSON_FORMAT", true) // rabbitMq消息文本是否为json格式,默认true + saveDays = cmn.GetEnvInt("GLC_SAVE_DAYS", 180) // 日志分仓时的保留天数(0~1200),0表示不自动删除,默认180天 + enableLogin = cmn.GetEnvBool("GLC_ENABLE_LOGIN", false) // 是否开启用户密码登录,默认“false” + sessionTimeout = cmn.GetEnvInt("GLC_SESSION_TIMEOUT", 30) // 登录会话超时时间,默认“30”分钟 + username = cmn.GetEnvStr("GLC_USERNAME", "glc") // 登录用户名,默认“glc” + password = cmn.GetEnvStr("GLC_PASSWORD", "GLogCenter100%666") // 登录密码,默认“GLogCenter100%666” + tokenSalt = cmn.GetEnvStr("GLC_TOKEN_SALT", "") // 令牌盐,默认“” + aryWhite = cmn.Split(cmn.GetEnvStr("GLC_WHITE_LIST", ""), ",") // IP或区域白名单,逗号分隔,默认“” + aryBlack = cmn.Split(cmn.GetEnvStr("GLC_BLACK_LIST", ""), ",") // IP或区域黑名单,逗号分隔,单个*代表全部,内网地址不受限制,默认“” + ipAddCity = cmn.GetEnvBool("GLC_IP_ADD_CITY", false) // IP是否要自动附加城市信息,默认false + clusterMode = cmn.GetEnvBool("GLC_CLUSTER_MODE", false) // 是否开启集群模式,默认false + splitUrls(cmn.GetEnvStr("GLC_CLUSTER_URLS", "")) // 从服务器地址,多个时逗号分开,默认“” + enableBackup = cmn.GetEnvBool("GLC_ENABLE_BACKUP", false) // 【X】是否开启备份,默认false + glcGroup = cmn.GetEnvStr("GLC_GROUP", "default") // 【X】日志中心分组名,默认“default” + minioUrl = cmn.GetEnvStr("GLC_MINIO_URL", "") // 【X】MINIO地址,默认“” + minioUser = cmn.GetEnvStr("GLC_MINIO_USER", "") // 【X】MINIO用户名,默认“” + minioPassword = cmn.GetEnvStr("GLC_MINIO_PASS", "") // 【X】MINIO密码,默认“” + 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数量(设定值不在实际数量范围是按最大看待) + 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 +} + +// 取配置: 定位相邻检索的查询件数,可通过环境变量“GLC_NEAR_SEARCH_SIZE”设定,默认200件 +func GetNearSearchSize() int { + return nearSearchSize } // 取配置: IP是否要自动附加城市信息,默认false @@ -143,6 +150,15 @@ func IsMulitLineSearch() bool { func GetPageSize() int { return pageSize } +func getNearSearchSizeConf(n int) int { + if n < 50 { + n = 50 + } + if n > 1000 { + n = 1000 + } + return n +} func getPageSizeConf(n int) int { if n < 1 { n = 1 diff --git a/glc/ldb/engine.go b/glc/ldb/engine.go index 17d7b0f..b3c0efe 100644 --- a/glc/ldb/engine.go +++ b/glc/ldb/engine.go @@ -155,19 +155,18 @@ func (e *Engine) Search(cond *search.SearchCondition) *search.SearchResult { // 多关键词查询模式 if cond.NewNearId > 0 { // 相邻检索模式的判断及条件准备 - max := conf.GetPageSize() - leftSize := 20 + max := conf.GetNearSearchSize() cond.CurrentId = cond.NewNearId isForward := cond.OldNearId < 1 || cond.NewNearId < cond.OldNearId // 是否向下检索更多的旧日志 // 搜索更多的新数据 // 反向检索前x条 - cond.Forward = false - if isForward { - cond.SearchSize = leftSize - } else { - cond.SearchSize = max - leftSize + leftSize := 20 + if !isForward { + leftSize = max - leftSize } + cond.Forward = false + cond.SearchSize = leftSize rs = search.SearchWordIndex(e.storeName, cond) // 定位日志1条固定(不管是否满足检索条件) ldm := search.GetLogDataModelById(cond.NearStoreName, cond.NewNearId) diff --git a/glc/ldb/search/search_keys.go b/glc/ldb/search/search_keys.go index 10c11a4..e3d3e4a 100644 --- a/glc/ldb/search/search_keys.go +++ b/glc/ldb/search/search_keys.go @@ -364,7 +364,7 @@ func findSame(cond *SearchCondition, minDocumentId uint32, maxDocumentId uint32, // 简单检查排除没结果的情景 totalCount := minIdx.idxwordStorage.GetTotalCount(minIdx.word) - if totalCount == 0 || (totalCount == 1 && cond.CurrentId > 0) { + if totalCount == 0 || (cond.NewNearId == 0 && totalCount == 1 && cond.CurrentId > 0) { return rs // 索引件数0、或只有1条又还要跳过,都是找不到 }