Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/PHP SQLite查询波兰语字母Ł/ł;在FTS4/FTS5中_Php_Python_Sqlite_Tokenize_Fts4 - Fatal编程技术网

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

Python/PHP SQLite查询波兰语字母Ł/ł;在FTS4/FTS5中,php,python,sqlite,tokenize,fts4,Php,Python,Sqlite,Tokenize,Fts4,由于SQLite FTS4/FTS5标记器=unicode61为我们提供: a=A=ą=Ą=ä=Ä ... z=ż=ź=Z=Ż=Ź=Ž=ž ... etc... 为什么不呢???这不是一只虫子吗 如何在没有波兰字符的keybord上查询SQLite?例如,查询像“zabczynski”这样的nameŻabczyński会得到结果,但查询像“wlast”这样的name Włast会得到结果(应该是数百…) 我在PHP中进行了演练,但它不能处理包含l和ł的单词,比如“opłacalny” <

由于SQLite FTS4/FTS5标记器=unicode61为我们提供:

a=A=ą=Ą=ä=Ä ...
z=ż=ź=Z=Ż=Ź=Ž=ž ...
etc...
为什么不呢???这不是一只虫子吗

如何在没有波兰字符的keybord上查询SQLite?例如,查询像“zabczynski”这样的nameŻabczyński会得到结果,但查询像“wlast”这样的name Włast会得到结果(应该是数百…) 我在PHP中进行了演练,但它不能处理包含l和ł的单词,比如“opłacalny”

<?
$q = $_POST["q"];
//
$pat = '/(\b\w*[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);
?>

有什么想法吗?不能在sqlite中设置编码,如utf8\u general\u ci、utf8\u polish\u ci、utf8\u unicode\u ci。。。或者是的,有可能吗


有没有办法用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" })
同样不幸的是,这将使得无法在这些字段上使用索引进行搜索


更好的方法是执行相反的操作,“ascify”您的字符串,并将它们作为附加列(具有自己的索引!)输入数据库;然后“ascify”您的查询,并观察它的工作情况。更好的是,看看您的“ascified”查询是否与原始查询相同;如果是,则使用“ascified”列(因为用户仅输入ASCII字符);如果它们不同,那么用户输入的是特定于波兰语的字符,并且可能输入的字符都是正确的,所以使用原始列。这样,如果用户输入“Żabczyński”,您可以在原始列中搜索“Żabczyński”并在那里找到它。如果用户输入“Zabczynski”,则假定它可能已ascified,并在ascified列中搜索;如果他们在那里,它会找到“阿布琴斯基”、“扎布琴斯基”、“阿布琴斯基”和“扎布琴斯基”。如果用户输入“Zabczyński”或“Żabczynski”,他们大概应该知道波兰语,因此在原始列中搜索,不返回任何结果。所有这些胜利都是以只存储一份专栏为代价的。

转到MySQL或Postgres。SQLite有其局限性

正则表达式能帮你实现你想做的吗?希望如此。但我已经用过正则表达式了。它只适用于带有“ł”的单词,所以“płakała”是“plakala”,但“leciał”!”谢谢,但这是FTS的查询。一堆字母、姓名和头衔。什么是FTS查询?可能是全文搜索?不确定@AmadanAh right:)无论如何,最后一段中描述的第二种更好的方法应该能够透明快速地进行全文搜索。对不起,是的,这是全文搜索。:)