Python / PHP SQLite在FTS4 / FTS5中查询波兰字母Ł/ł



因为SQLite FTS4/FTS5 tokenizer=unicode61给了我们:

a=A=ą=Ą=ä=Ä ...
z=ż=ź=Z=Ż=Ź=Ž=ž ...
etc...

为什么不 l=ł=L=Ł ???这不是一个错误吗?

如何在没有波兰字符 ł/ł 的键盘上查询 SQLite?例如,查询名称 Żabczyński 如"zabczynski" - 得到结果,但对于名称 Włast 如"wlast" - 0 结果(应该像数百个...... 我在 PHP 中四处走动,但它不适用于其中带有 l 和 ł 的单词,例如"opłacalny"。

<?
$q = $_POST["q"];
//
$pat = '/(bw*[lł]w*b)/iu';
$q = preg_replace_callback($pat,function($macz){
return "(" . str_replace("ł","l",$macz[1]) . "* OR " . str_replace("l","ł",$macz[1]) . "*)";
},$q);
// so query 'andrzej wlast' looks 'andrzej (wlast* OR włast*)'
...
$sql = "SELECT ...";
$pdo = $db->prepare($sql);
//
$pdo->execute([":q" => "$q*"]);
//
$odp = $pdo->fetchAll(PDO::FETCH_ASSOC);
?>

知道吗?您不能像 utf8_general_ci、utf8_polish_ci utf8_unicode_ci 那样在 sqlite 中设置编码...或者,有可能吗?

有没有办法在Python中解决它?平台上没有 ICU(共享服务器(。

不幸的是,不,SQLite没有像MySQL这样的整理表,因为它会使本应非常小且可移植的库膨胀。

您可以将查询转换为如下所示的内容:

SELECT * FROM foo WHERE word REGEXP '^[ZŻ]abczy[nń]ski$';
SELECT * FROM foo WHERE word REGEXP '^W[lł]ast$';

这在Python中很容易:

def collatify(string, equivalents):
for original, replacement in equivalents.items():
string = string.replace(original, '[%s%s]' % (original, replacement))
return string
collatify('Żabczyński', { "Ż": "Z", "ń": "n" })

同样不幸的是,这将使无法使用索引搜索这些字段。

更好的方法是执行相反的操作,"asci化"字符串,并将它们作为附加列(带有自己的索引!(输入数据库;然后"asciify"您的查询,并观察它的工作。更好的是,查看您的"腹水"查询是否与原始查询相同;如果是,请使用"asciified"列(因为用户仅输入 ASCII 字符(;如果它们不同,则用户输入波兰语特定的字符,并且可能全部正确输入,因此请使用原始列。这样,如果用户输入"Żabczyński",您可以在原始列中搜索"Żabczyński"并在那里找到它。如果用户输入"Zabczynski",假设它可能被腹水,并在腹水列中搜索;它会找到"Żabczyński","Zabczyński","Żabczynski"和"Zabczynski",如果他们在那里。如果用户输入"Zabczyński"或"Żabczynski",大概他们应该知道波兰语,所以在原始列中搜索并且不返回任何结果。所有这些胜利都是以仅存储列的多副本为代价的。

迁移到 MySQL 或 Postgres。SQLite有其局限性。

相关内容

  • 没有找到相关文章

最新更新