突出显示搜索结果:正则表达式字符排序规则


Highlighting Search Results: RegEx Character Collation?

当我运行全文MySQL查询时,由于Unicode字符排序规则,我将获得与以下所有内容匹配的结果,无论我查询哪个:saka, sakā, śāka, ṣaka等。

我陷入困境的地方是在搜索结果中突出显示匹配项。使用标准正则表达式,我只能在结果中匹配和突出显示原始查询词 - 而不是所有整理的匹配项。

如何解决这个问题?我最初想到了这些方法:

  • 创建一个正则表达式模式,该模式将针对所有可能的变体分析目标结果。很容易变成一个臃肿图案的怪物。
  • 创建结果的规范化版本,在其中找到匹配项,并使用字符串位置作为突出显示的基础。

但是,与突出显示的常规搜索结果相比,这两种方法都会产生大量的处理开销。第一种方法会产生巨大的 CPU 开销;第二个可能会消耗更少的 CPU,但至少要咀嚼两倍的 RAM 以获得结果。有什么建议吗?

附言如果相关:我正在处理的特定字符集(带有扩展名的梵文音译的 IAST)有 L 和 N 的三种变体;M、R 和 S 的两个变体;以及A、D、E、H、I、T和U的一个变体;总共 A-Z + 19 个变音符号变体;+ 大写(这在这里没有问题)。

使用 MySQL 及其正则表达式,您只能找到与 REGEXP 匹配的行。 您无法在列中找到匹配项。

REGEXP 和 LIKE 都遵循相关列的排序规则,但这无助于查找列中的文本。

查看MariaDB及其REGEXP_REPLACE。

MySQL至少有一个与之相关的错误:http://bugs.mysql.com/bug.php?id=70767

这是我最终做的事情。似乎对性能的影响可以忽略不计。(我没有注意到!

首先,将查询词转换为迭代变体的正则表达式的函数:

function iast_normalize_regex($str) {
    $subst = [ 
        'a|ā', 'd|ḍ', 'e|ӗ', 'h|ḥ', 'i|ī', 'l|ḷ|ḹ', 'm|ṁ|ṃ', 
        'n|ñ|ṅ|ṇ', 'r|ṛ|ṝ', 's|ś|ṣ', 't|ṭ', 'u|ū' 
        ];
    $subst_rex = [];
    foreach($subst as $variants) {
        $chars = explode('|', $variants);
        foreach($chars as $char) {
            $subst_rex[$char] = "({$variants})";
        }
    }
    $str_chars = str_split_unicode($str);
    $str_rex = '';
    foreach($str_chars as $char) {
        $str_rex .= !isset($subst_rex[$char]) ? $char : $subst_rex[$char];
    }
    return $str_rex;
}

这会将sakaśaka等词变成(s|ś|ṣ)(a|ā)k(a|ā)。然后,使用变体迭代的单词模式突出显示搜索结果:

$word = iast_normalize_regex($word);
$result = preg_replace("#({$word})#iu", "<b>$1</b>", $result);

Presto:我突出显示了所有变体。感谢您到目前为止的贡献,如果您能想到更好的方法来实现这一目标,请告诉我。干杯!