This commit is contained in:
lychang
2026-07-20 01:49:49 +08:00
parent 97c2c208ba
commit 1700585a36
2 changed files with 23 additions and 1 deletions

View File

@@ -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::<Vec<[String; 2]>>(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;

View File

@@ -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; }