diff --git a/src/engine/pipeline.rs b/src/engine/pipeline.rs index 0bcfa3b..3d4e40e 100644 --- a/src/engine/pipeline.rs +++ b/src/engine/pipeline.rs @@ -203,6 +203,21 @@ pub async fn phase_detect_person_in_tags(db: &Database) -> (DirtySet, usize) { let (primary, aliases) = title_parser::split_person_name_with_aliases(person_name); let final_name = if primary.is_empty() { person_name.clone() } else { primary }; + // 跳过字符串 <= 2 的人名(太短不像人名) + if final_name.chars().count() <= 2 { + // 仍需将标签从 clean_tags 中排除(人名相关标签已被移除) + let tags_json_new = serde_json::to_string(&clean_tags).unwrap_or_else(|_| "[]".to_string()); + let all_words_json = album.all_words.as_deref().unwrap_or("[]"); + let all_words_new: Vec<[String; 2]> = serde_json::from_str::>(all_words_json) + .unwrap_or_default() + .into_iter() + .filter(|pair| !known_persons.contains(&pair[0].to_lowercase())) + .collect(); + let words_json_new = serde_json::to_string(&all_words_new).unwrap_or_else(|_| "[]".to_string()); + db.update_album_tags(&album.id, &tags_json_new, &words_json_new).await; + continue; + } + // 用事务包裹所有写入,避免逐条 autocommit 导致巨慢 let mut tx = db.pool.begin().await.expect("begin tx"); db.update_album_person_with_tx(&mut tx, &album.id, person_name, &final_name).await; @@ -386,6 +401,12 @@ pub async fn phase_parse_dirty(db: &Database, dirty_set: &DirtySet) -> (usize, u if let Some(name) = &best_person { let (primary, aliases) = title_parser::split_person_name_with_aliases(name); let final_name = if primary.is_empty() { name.clone() } else { primary }; + + // 跳过字符串 <= 2 的人名(太短不像人名) + if final_name.chars().count() <= 2 { + continue; + } + let mut tx = db.pool.begin().await.expect("begin tx"); db.update_album_person_with_tx(&mut tx, &album.id, name, &final_name).await; let pid = db.insert_person_with_tx(&mut tx, &final_name, None).await; diff --git a/src/engine/title_parser.rs b/src/engine/title_parser.rs index 4eaf987..e1f8645 100644 --- a/src/engine/title_parser.rs +++ b/src/engine/title_parser.rs @@ -340,7 +340,8 @@ pub fn is_excluded_name(name: &str) -> bool { pub fn is_likely_person_name(name: &str) -> bool { let name = name.trim(); if name.is_empty() { return false; } - if name.len() < 2 { return false; } + // 字符数必须 >= 3(人名至少需要 2 个中文字或 3 个英文字母) + if name.chars().count() <= 2 { return false; } // 先排除已知的非人名 if is_excluded_name(name) { return false; }