繁体   English   中英

突出显示搜索结果:RegEx字符排序规则?

[英]Highlighting Search Results: RegEx Character Collation?

当我运行全文MySQL查询时,由于使用Unicode字符归类,我将获得与以下所有内容匹配的结果,无论我查询的是以下哪一项: saka, sakā, śāka, ṣaka等。

我遇到的问题是突出显示搜索结果中的匹配项。 使用标准RegEx,我只能在结果中匹配并突出显示原始查询词-并非所有归类的匹配项。

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

  • 创建一个RegEx模式,以针对所有可能的变体分析目标结果。 会轻易变成一个monster肿的怪物。
  • 创建结果的规范化版本,在其中找到匹配项,并使用字符串位置作为突出显示的基础。

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

PS:如果涉及到:我正在处理的特定字符集(带有扩展名的IAST梵文音译)具有L和N的三个变体; M,R和S的两个变体; 和A,D,E,H,I,T和U的一个变体; 总共AZ + 19个变音符号变体; +大写字母(这里没有问题)。

使用MySQL及其REGEXP,您只能找到与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:我将所有变体突出显示。 感谢您到目前为止所做的贡献,如果您能想到实现此目标的更好方法,请告诉我。 干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM