Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package srv_search
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
"videoweb/pub/esmanager"
|
|
"videoweb/pub/models/esmod"
|
|
)
|
|
|
|
const esSyncOverlap = time.Minute
|
|
|
|
// needFullESSync 判断是否需要全量同步 ES
|
|
func needFullESSync(ctx context.Context, esIndex string) (bool, *esmod.ESRecord) {
|
|
esRecord, serr := esmod.GetRecordTimeByESIndex(ctx, esIndex)
|
|
if serr != nil || esRecord == nil {
|
|
return true, esRecord
|
|
}
|
|
|
|
count, err := esmanager.Instance.Count(esIndex, esmanager.M{
|
|
"query": esmanager.M{"match_all": esmanager.M{}},
|
|
})
|
|
if err != nil || count == 0 {
|
|
return true, esRecord
|
|
}
|
|
|
|
now := time.Now()
|
|
if (now.Hour() >= 5 && esRecord.UpdatedAt.Local().Hour() < 5) ||
|
|
esRecord.UpdatedAt.Local().Day() < now.Day() {
|
|
return true, esRecord
|
|
}
|
|
return false, esRecord
|
|
}
|
|
|
|
// esSyncSinceTime 取增量同步起点(RecordTime 优先,回退 1 分钟避免边界遗漏)
|
|
func esSyncSinceTime(esRecord *esmod.ESRecord) time.Time {
|
|
if esRecord == nil {
|
|
return time.Time{}
|
|
}
|
|
since := esRecord.RecordTime
|
|
if since.IsZero() {
|
|
since = esRecord.UpdatedAt
|
|
}
|
|
if since.IsZero() {
|
|
return time.Time{}
|
|
}
|
|
return since.Add(-esSyncOverlap)
|
|
}
|