fix: restore kb retrieve fallback

This commit is contained in:
hajimi
2026-06-12 11:21:53 +08:00
parent f2b91a8bdc
commit dabde9abaf
+55 -8
View File
@@ -23,6 +23,28 @@ class KbService
{
public const COLLECTION_GLOBAL = 'global';
private const QUERY_TERM_ALIASES = [
'旧澳六合' => ['旧澳六合', '老澳门六合彩'],
'新澳六合' => ['新澳六合', '新澳门六合彩'],
];
private const QUERY_COMMON_TERMS = [
'分析线索',
'走势分析',
'开奖记录',
'开奖结果',
'冷热号',
'波色',
'生肖',
'特码',
'号码',
'彩票',
'比赛',
'新闻',
'马刺',
'NBA',
];
public static function upsertDocument(string $domain, string $subtype, int $sourceId): array
{
$transactionStarted = false;
@@ -320,11 +342,18 @@ class KbService
if (empty($candidates)) {
$keywordParts = self::splitQueryTerms($queryText);
$fallback = clone $query;
foreach (array_slice($keywordParts, 0, 3) as $term) {
$fallback->where(function ($subQuery) use ($term) {
$subQuery->whereLike('c.chunk_text', '%' . $term . '%')
->whereOrLike('d.title', '%' . $term . '%')
->whereOrLike('d.keywords', '%' . $term . '%');
if (!empty($keywordParts)) {
$fallback->where(function ($keywordQuery) use ($keywordParts) {
foreach (array_slice($keywordParts, 0, 8) as $index => $term) {
$like = '%' . $term . '%';
$method = $index === 0 ? 'where' : 'whereOr';
$keywordQuery->{$method}(function ($subQuery) use ($like) {
$subQuery->whereLike('c.chunk_text', $like)
->whereOr('d.title', 'like', $like)
->whereOr('d.summary', 'like', $like)
->whereOr('d.keywords', 'like', $like);
});
}
});
}
$candidates = $fallback->order('d.source_updated_at', 'desc')->limit($limit)->select()->toArray();
@@ -800,9 +829,27 @@ class KbService
return [];
}
$terms = preg_split('/[\s,,。!?;、:\/\\\\]+/u', $queryText) ?: [];
$terms = array_values(array_filter(array_map('trim', $terms), static fn(string $term) => mb_strlen($term) >= 2));
return array_unique($terms);
$terms = [];
foreach (self::QUERY_TERM_ALIASES as $trigger => $aliases) {
if (mb_strpos($queryText, $trigger) !== false) {
array_push($terms, ...$aliases);
}
}
foreach (self::QUERY_COMMON_TERMS as $term) {
if (mb_strpos($queryText, $term) !== false) {
$terms[] = $term;
}
}
$parts = preg_split('/[\s,,。!?;、:\/\\\\]+/u', $queryText) ?: [];
array_push($terms, ...$parts);
$terms = array_values(array_filter(array_map('trim', $terms), static function (string $term) {
return mb_strlen($term) >= 2;
}));
return array_values(array_unique($terms));
}
private static function normalizeHtmlText(string $html): string