Mamy dwa ciągi znaków.
Dłuższy np. "Piszę w sprawie Jan Kowalski" i listę możliwych użytkowników.
Chciałbym określić o jakiej osobie mowa jest w zdaniu, oczywiście najłatwiejsza opcja to sprawdzenie czy występuje w ciągu znaków imię i nazwisko oraz ewentualnie odwrotność. Ok, to mamy z z głowy, ale algorytm musi być bardziej zaawansowany i wykryć odmiany np. Jana Kowalskiego, Janka Kowalski itp. Nie zależy mi na 100% rozpoznaniu, wystarczy mi najbardziej zbliżony. Ktoś się kiedyś zmierzył?
Póki co mam 3 prototypy.
- Full index.
select id, title, score from (SELECT id, title, MATCH (`title`) AGAINST('(Paweł* Żyra*) ("Paweł Żyra")' IN BOOLEAN MODE) as score FROM titles) t where `id` = 3 group by `score` having `score` > 0 order by `score` desc limit 1
To najbardziej udane rozwiązanie, radzi sobie dość dobrze ale jest taki moment że po prostu się zacina i score wskakuje na zero np. przy frazie "Pawła Żyry" (ale radzi sobie jeszcze z np. "za Pawla Zyra"). Dużymm minusem jest optymalność, jak widać to wykonuje tyle zapytań ile mamy do przeszukania tytułów i nazwisk ponieważ nie da się wyszukiwać po wielu frazach.
- Similar text
Czasem daje super wyniki, czasem beznadziejne. Z pewnością było by to dobre gdybym miał pewność że w title jest tylko imię i nazwisko.
- levenshtein
Podobnie jak wyżej.
2 i 3 są znacznie szybsze i dają łatwiejszą manipulacje (np. mogę bez problemu wyciąć pl znaki i je ignorować, w mysql tego w locie nie potrafię zrobić albo byłoby to skomplikowane).