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

php (размито) съвпадение на търсене

За съжаление, правенето на това в PHP е непосилно скъпо (високо използване на процесора и паметта). Въпреки това, със сигурност можете да приложите алгоритъма към малки набори от данни.

За да разширите конкретно как можете да създадете срив на сървъра:няколко вградени PHP функции ще определят "разстоянието" между низовете:levenshtein и подобен_текст .

Фиктивни данни:(преструвайте се, че са заглавия на новини)

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

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

В този момент $titles трябва да бъде просто масив от низове. Сега създайте матрица и сравнете всяко заглавие с ВСЯКО друго заглавие за сходство. С други думи, за 5 заглавия ще получите матрица 5 x 5 (25 записа). Това е мястото, където процесорът и приемникът на паметта влизат.

Ето защо този метод (чрез PHP) не може да се приложи към хиляди записи. Но ако искате:

$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  );
}

В този момент това, което основно имате, е матрица с "текстови разстояния". По концепция (не в реални данни) изглежда като тази таблица по-долу. Обърнете внимание как има набор от 0 стойности, които вървят по диагонал - това означава, че в цикъла за съвпадение две еднакви думи са - добре, идентични.

       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

Действителният масив $matches изглежда така (съкратено):

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

    [Apples] => Array
        (
      ...

Както и да е, от вас зависи (чрез експериментиране) да определите на какво най-вече може да съвпадне едно добро цифрово прекъсване на разстоянието - и след това да го приложите. В противен случай прочетете sphinx-search и го използвайте - тъй като има PHP библиотеки.

Orange, радваш ли се, че попита за това?



  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

  2. Вземете общите отработени часове за един ден mysql

  3. Как мога да се справя със заявки за припокриване на многоъгълници на MySQL?

  4. Как да форматирате числата като валута в MySQL

  5. mysql count група по поръчка чрез оптимизация