У меня есть таблица в базе данных MySQL8 с именем команды.Моя цель для этой таблицы и некоторых других с той же проблемой, учитывая строку, содержащую одно или несколько слов, и предполагая, что моя строка не точно совпадает ни с одной другой в записи, выполнить нечеткое сопоставление строк, чтобы получить ближайшую строку.Эта таблица имеет 2 строки, одна с индексом первичного ключа, а другая называется «имена».Хотя в моем наборе данных может быть около 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')
В этом случае терминалу требуется всегда, чтобы реализовать первое предложение, а неЯ не знаю, сработает ли что-то дальше и как.
У меня возникнут вопросы, почему не работает Fulltext?После исправления это будет так быстро / точно?Есть ли третий вариант на самом деле лучше, чем эти 2?