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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...