gpt4 book ai didi

python - SQLITE 自定义 Accent 排序规则函数和 LIKE 查询

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:06 26 4
gpt4 key购买 nike

我在 Python3 中创建了这个 NOACCENT COLLATION,以便在我正在尝试编写的 sqlite 数据库程序中使用它。

我的目标是使带口音的人声搜索不敏感,并使数据输入对口音不敏感,这样(即)如果该表字段中已存在“González”值,则不会接受值“González”。

我所做的对于第二部分(限制值)和完整的值搜索效果很好。我无法使其适用于 SELECT ... LIKE 表达式。我知道 SQLite 中 COLLATE NOCASE 对于 a-z、A-Z 之外的 unicode 字符的 LIKE 限制,但是为什么当我使用自己定义的排序规则 NOACCENT 时会应用该限制?因为看起来这就是正在发生的事情。

示例:

cur.execute(""" CREATE TABLE Demo(
Id INTEGER PRIMARY KEY,
Nombre TEXT COLLATE NOACCENT UNIQUE)""")

cur.execute("INSERT INTO Demo(Nombre) VALUES ('álberto')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('alberta')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Álbertu')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Álberte')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('Albertczo')")
cur.execute("INSERT INTO Demo(Nombre) VALUES ('albertai')")

如果我这样做:

cur.execute("SELECT * FROM Demo WHERE Nombre='ALBERTO' COLLATE NOACCENT")

我得到:

(1, 'álberto)

什么都好。这适用于大小写的任意组合以及单词的任何声音中的任何重音(“ALBERTÓ”、“阿尔贝尔托”...)

如果我尝试插入值“ALBERTÓ”,由于唯一约束,我会收到错误,因此效果很好。

问题是当我尝试使用 LIKE 表达式时:

cur.execute("SELECT * FROM Demo WHERE Nombre LIKE 'ALBERT%' COLLATE NOACCENT")

返回:

(2, 'alberta')
(5, 'Albertczo')
(6, 'albertai')

不带重音符号的值。

数据库本身是否有任何解决方案,或者我是否必须通过软件进行部分搜索(即“albert”)。

希望我的问题足够清楚。

提前致谢。

<小时/>
def noaccent(string): # eliminate accented vocals
vocals = ['a', 'e', 'i', 'o', 'u'] * 4
acc_vocals = ['á', 'é', 'í', 'ó', 'ú','à', 'è', 'ì', 'ò', 'ù', 'ä', 'ë', 'ï', 'ö', 'ü', 'â', 'ê', 'î', 'ô', 'û']
no_acc = string
for letter in acc_vocals:
no_acc = no_acc.replace(letter, vocals[acc_vocals.index(letter)])
return no_acc

def collate_noaccent(string1, string2):
str1 = noaccent(string1.lower())
str2 = noaccent(string2.lower())
if str1 < str2:
return -1
elif str1 > str2:
return 1
else:
return 0

最佳答案

我通过在我设计的 SqliteUnicode 类中创建自己的“like”函数解决了这个问题。它使搜索速度减慢了 8 倍。由于该类尚未优化,我不想现在将其发布在这里,除非您要求。

    link = sqlite.connect(db_file_s)
extension = SqliteUnicode()
link.create_collation("france", extension.collate)
link.create_function("like", 2, extension.like)

编辑 2019:您可以在这里找到类(class): https://pastebin.com/FvMZdBY5请注意,我不是专业人士,仍然存在一些情况,个性化的“点赞”可能会导致错误。正则表达式需要改进,但对于我们在图书馆数据库中的使用来说,它已经工作多年了。如果您改进了这项工作,请分享。

关于python - SQLITE 自定义 Accent 排序规则函数和 LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26871674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com