Поиск в столбце MySQL ближайшего совпадения строк и разницы в производительности в Python 3.7

У меня есть таблица в базе данных 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?

0 ответов

Другие вопросы по тегам