Browse Source

dev 2020-11

Max F 5 years ago
parent
commit
8630e9964f
1 changed files with 16 additions and 13 deletions
  1. 16 13
      src/Database/Sql/SqlTools.php

+ 16 - 13
src/Database/Sql/SqlTools.php

@@ -339,6 +339,7 @@ class SqlTools
             $w_regex = $db->escape('\b' . preg_quote($word) . '\b');
 
             // score de position parmi les mots de recherche
+            //$word_idx_score = 1 / $word_pos;
             $word_idx_score = ($words_count - $word_idx) / $words_count;
 
             // score de longueur du mot par rapport à la longueur total de l'expression de recherche
@@ -353,42 +354,44 @@ class SqlTools
                 //$field_pos = $field_idx + 1;
 
                 // score de position du champ sql parmis tous les champs où on va rechercher
+                //$field_idx_score = 1 / $field_pos;
                 $field_idx_score = ($fields_count - $field_idx) / $fields_count;
                
-                // score de longueur par rapport a la longueur du champ sql
-                //$word_len = strlen($word);
+                // score de longueur du mot (de recherche) par rapport a la longueur du champ sql
                 $word_field_len_score = 1;
-                $word_field_len_score = "(0.9 + 0.1 * (least($word_len / length($field), length($field) / $word_len)) )"; // longueur du mot (de recherche) rapport à la longueur du champ sql
+                $weight = "0.9 + 0.1 *";
+                $word_field_len_score = "( $weight (least($word_len / length($field), length($field) / $word_len)) )";
+                 // TODO: algo et poids à revoir
 
-                // score de position de match dans la valeur du champ sql
+                // score de position du mot dans la valeur du champ sql
                 //$locate_max = "(greatest(1, length($field) - $word_len) )";
                 //$word_match_pos_score = "( ($locate_max - locate($w, $field)) / $locate_max)";
                 $word_match_pos_score = 1;
-                $word_match_pos_score = "(0.5 + 0.5 * (1 + length($field) - locate($w, $field)) / length($field) )";
+                $weight = "0.5 + 0.5 *";  // TODO: poids à revoir
+                $word_match_pos_score = "( $weight (1 + length($field) - locate($w, $field)) / length($field) )";
 
                 // score distance levenshtein
                 $word_levenshtein_score = 1;
                 if ($use_levenshtein) {
-                    //$word_levenshtein_score = "( levenshtein_ratio($field, $w) / 100 )";
+                    //$word_levenshtein_score = "( if(length($field) < 64, levenshtein_ratio($field, $w) / 100, 0.01) )";
                 }
 
-
-                // score distance levenshtein
+                // score soundex
                 $word_soundex_score = 1;
                 if ($use_soundex) {
-                    //$word_soundex_score = "( least(mid(soundex(" . $field . "), 2) / mid(soundex(" . $w_like . "), 2), mid(soundex(" . $w_like . "), 2) / mid(soundex(" . $field . "), 2)) )";
+                    //$word_soundex_score = "( if(length($field) < 64, least(mid(soundex(" . $field . "), 2) / mid(soundex(" . $w_like . "), 2), mid(soundex(" . $w_like . "), 2) / mid(soundex(" . $field . "), 2)), 0.01) )";
                 }
 
                 // matching
                 $extra_rules = "";
                 if ($use_soundex) {
-                    $extra_rules .= " when soundex(" . $field . ") = soundex(" . $w_like . ") then 0.3
-                                        when (abs(mid(soundex(" . $field . "), 2) - mid(soundex(" . $w_like . "), 2)) <= 5 and left(soundex(" . $field . "),1) = left(soundex(" . $w_like . "),1) ) then 0.2
-                                        when (abs(mid(soundex(" . $field . "), 2) - mid(soundex(" . $w_like . "), 2))) <= 5 then 0.1
+                    $extra_rules .= " when length($field) < 64 and soundex(" . $field . ") = soundex(" . $w_like . ") then 0.3
+                                        when length($field) < 64 and (abs(mid(soundex(" . $field . "), 2) - mid(soundex(" . $w_like . "), 2)) <= 5 and left(soundex(" . $field . "),1) = left(soundex(" . $w_like . "),1) ) then 0.2
+                                        when length($field) < 64 and (abs(mid(soundex(" . $field . "), 2) - mid(soundex(" . $w_like . "), 2))) <= 5 then 0.1
                                         ";
                 }
                 if ($use_levenshtein) {
-                    //$extra_rules .= " when levenshtein_ratio($field, $w) > 90 then 0.3 when levenshtein_ratio($field, $w) > 70 then 0.1 ";
+                    //$extra_rules .= " when length($field) < 64 and levenshtein_ratio($field, $w) > 90 then 0.3 when length($field) < 64 and levenshtein_ratio($field, $w) > 70 then 0.1 ";
                 }
                 $word_matching_score = "(case when $field = '' then 0
                                          when $field = $w then 1