Mysql
 sql >> Baza danych >  >> RDS >> Mysql

php (rozmyte) wyszukiwanie dopasowania

Niestety, robienie tego w PHP jest nadmiernie kosztowne (wysokie wykorzystanie procesora i pamięci). Jednak z pewnością możesz zastosować algorytm do małych zestawów danych.

Aby szczegółowo rozwinąć, w jaki sposób można utworzyć awarię serwera:kilka wbudowanych funkcji PHP określi „odległość” między ciągami:levenshtein i podobny_tekst .

Fikcyjne dane:(udawaj, że to nagłówki wiadomości)

$titles = <<< EOF
Apple
Apples
Orange
Oranges
Banana
EOF;

$titles = explode("\n", $titles );

W tym momencie $titles powinna być po prostu tablicą ciągów. Teraz utwórz macierz i porównaj każdy nagłówek z KAŻDYM innym nagłówkiem pod kątem podobieństwa. Innymi słowy, w przypadku 5 nagłówków otrzymasz macierz 5 x 5 (25 wpisów). To właśnie tam trafia procesor i ujście pamięci.

Dlatego ta metoda (poprzez PHP) nie może być zastosowana do tysięcy wpisów. Ale jeśli chcesz:

$matches = array();
foreach( $titles as $title ) {
    $matches[$title] = array();
    foreach( $titles as $compare_to ) {
        $matches[$title][$compare_to] = levenshtein( $compare_to, $title );
    }
    asort( $matches[$title], SORT_NUMERIC  );
}

W tym momencie masz w zasadzie macierz z „odległościami tekstu”. W koncepcji (nie w rzeczywistych danych) wygląda to tak, jak ta tabela poniżej. Zwróć uwagę, że istnieje zestaw wartości 0, które biegną po przekątnej - oznacza to, że w pętli dopasowywania dwa identyczne słowa są - no cóż, identyczne.

       Apple Apples Orange Oranges Banana
Apple    0     1      5      6       6
Apples   1     0      6      5       6
Orange   5     6      0      1       5
Oranges  6     5      1      0       5
Banana   6     6      5      5       0

Rzeczywista tablica $matches wygląda mniej więcej tak (obcięta):

Array
(
    [Apple] => Array
        (
            [Apple] => 0
            [Apples] => 1
            [Orange] => 5
            [Banana] => 6
            [Oranges] => 6
        )

    [Apples] => Array
        (
      ...

W każdym razie od Ciebie zależy (poprzez eksperymentowanie) określenie, do czego może pasować dobre liczbowe odcięcie odległości – a następnie zastosowanie go. W przeciwnym razie przeczytaj o sphinx-search i użyj go - ponieważ ma biblioteki PHP.

Orange, cieszysz się, że o to pytałeś?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:wybierz 5 wierszy przed i po określonym wierszu

  2. Czy wątek mysql_insert_id jest bezpieczny?

  3. Jak dodać 1 godzinę do currrent_timestamp w mysql, która jest wartością domyślną?

  4. Jak konwertować małe litery na wielkie w MySQL

  5. Osiągnij hierarchię, relacje rodzic/dziecko w skuteczny i łatwy sposób