我在MySQL8数据库中有一个名为teams的表。我的目标是这个表和其他一些具有相同问题的表,给定一个包含一个或多个单词的字符串,并且假设我的字符串与记录中的任何其他字符串都不完全匹配,则执行一些模糊字符串匹配以获得最近的行。该表有两行,一行带有主键索引,另一行称为“names”。
虽然我的数据集可能有10000条记录,但在未来不太可能达到一个数量级。
我想了两种可能的方法。方法一,提取所有数据并进行模糊字符串匹配。方法二,使用全文索引并执行匹配。。。反对
第一条路
cursor=db.cursor(buffered=True)
equipo='Hapoel Tel Aviv'
a=timeit.default_timer()
cursor.execute('SELECT teamid,nombre FROM equipos')
listae=[a for a in cursor]
print('row 1 de la lista',listae[0])
b=timeit.default_timer()
lista2=[a[1] for a in listae]
c=timeit.default_timer()
sol=process.extractOne(equipo,lista2,scorer=fuzz.token_sort_ratio)
print('best match',sol)
d=timeit.default_timer()
cursor.execute('SELECT teamid,nombre FROM equipos WHERE nombre=%s',(sol[0],))
row=cursor.fetchall()
e=timeit.default_timer()
for row in listae:
if sol[0]==row[1]: break
print('id y equipo',row)
f=timeit.default_timer()
print(b-a,c-b,d-c,e-d,f-e)
>>>0.06649364937199209 0.0005017736623500468 0.37029168459135064 0.0006061482259838158 0.0003117132238372733
只是想弄清楚f和e之间,e和d之间是什么,但我想知道哪个更快。
方法二,根据互联网,我试着执行全文查询
cursor.execute('ALTER TABLE equipos ADD FULLTEXT(nombre)')
print('here')
cursor.execute('SELECT teamid,nombre FROM equipos WHERE MATCH(nombre) AGAINST ("{}" WITH QUERY EXPANSION)'.format(equipo))
res2=[a for a in cursor]
print('resultado de 2',res2)
cursor.execute('ALTER TABLE equipos DROP INDEX')
在这种情况下,终端要花很长时间来实现第一句话,无法完成它,所以我甚至不知道接下来会发生什么,以及如何工作。
我的问题是,为什么全文不起作用?一旦修好了,它会不会同样快速/准确?有没有比这两个更好的第三种选择呢?