Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL смесване на Damerau–Levenshtein Fuzzy с Like Wildcard

При работата с имена на хора и правенето на размити търсения върху тях, това, което работи за мен, беше да създам втора таблица с думи. Също така създайте трета таблица, която е пресечна таблица за връзката много към много между таблицата, съдържаща текста, и таблицата с думи. Когато към текстовата таблица се добави ред, вие разделяте текста на думи и попълвате пресечната таблица по подходящ начин, като добавяте нови думи към таблицата с думи, когато е необходимо. След като тази структура е на място, можете да правите търсения малко по-бързо, защото трябва само да изпълнявате функцията си damlev върху таблицата с уникални думи. Едно просто присъединяване ви получава текста, съдържащ съвпадащите думи.

Заявка за съвпадение на една дума би изглеждала така:

SELECT T.* FROM Words AS W
JOIN Intersect AS I ON I.WordId = W.WordId
JOIN Text AS T ON T.TextId = I.TextId
WHERE damlev('document',W.Word) <= 5 

и две думи биха изглеждали така (извън главата ми, така че може да не са точно правилни):

SELECT T.* FROM Text AS T
JOIN (SELECT I.TextId, COUNT(I.WordId) AS MatchCount FROM Word AS W
      JOIN Intersect AS I ON I.WordId = W.WordId
      WHERE damlev('john',W.Word) <= 2
            OR damlev('smith',W.Word) <=2
      GROUP BY I.TextId) AS Matches ON Matches.TextId = T.TextId
          AND Matches.MatchCount = 2

Предимствата тук, с цената на малко пространство в базата данни, са, че трябва само да приложите скъпата във времето функция damlev към уникалните думи, които вероятно ще се броят само в 10-те хиляди, независимо от размера на вашата таблица с текст. Това има значение, тъй като damlev UDF няма да използва индекси - той ще сканира цялата таблица, върху която е приложен, за да изчисли стойност за всеки ред. Сканирането само на уникалните думи трябва да бъде много по-бързо. Другото предимство е, че damlev се прилага на ниво дума, което изглежда е това, което искате. Друго предимство е, че можете да разширите заявката, за да поддържате търсене по множество думи, и можете да класирате резултатите, като групирате съвпадащите пресичащи се редове в TextId и класирате според броя на съвпаденията.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Значение на n:m и 1:n в дизайна на база данни

  2. Как да промените часовата зона на MySQL сървъра

  3. основно сравнение на датите за проверка на изтичане

  4. Двигател за съхранение на Mysql за таблица с регистрационни файлове

  5. Извличане на RAND() редове без ORDER BY RAND() само с една заявка