Max F 5 лет назад
Родитель
Сommit
3268bc75f6
2 измененных файлов с 32 добавлено и 4 удалено
  1. 17 0
      src/App.php
  2. 15 4
      src/Database/Sql/SqlTools.php

+ 17 - 0
src/App.php

@@ -23,6 +23,7 @@ class App
 	protected static $helpers_dirs = [FW_SRC_DIR . "/helpers", APP_DIR . "/src/helpers"];
 
 	public static $db = null;
+	public static $data = [];
 
 
 	public static function boot()
@@ -90,6 +91,22 @@ class App
 		}
 	}
 
+	
+	public static function setData($key, $value=null)
+	{
+		self::$data[$key] = $value;
+	}
+
+	public static function getData($key, $default_value=null)
+	{
+		return array_key_exists($key, self::$data) ? self::$data[$key] : $default_value;
+	}
+
+	public static function hasData($key)
+	{
+		return array_key_exists($key, self::$data);
+	}
+
 
 	public static function unregisterHelpersDir($dir)
 	{

+ 15 - 4
src/Database/Sql/SqlTools.php

@@ -230,23 +230,34 @@ class SqlTools
         }
 
         $q = trim($q);
+
+        $pow_pos_word = 0.5;             // correspond à l'index du mot parmi tous les mots de la recherche
+        $pow_pos_field = 0.5;            // correspond à l'index du champ (SQL) de recherche parmi tous les champs de recherche
+        $pow_pos_match = 0.5;            // correspond à la position strpos de la chaine recherchée trouvée dans un des champs de recherche
+        $pow_length_field_value = 0.3;   // correspond à la taille (du texte) de la valeur du champ dans lequel on a trouvé le match
+
+        $coef_pos_word = 1;
+        $coef_pos_field = 1;
+        $coef_pos_match = 1;
+        $coef_length_field_value = 1;
         
         if ($search_fields && strlen($q) >= $min_str_length) {
             $words = explode(" ", $q);
 
             foreach ($words as $word_idx => $word) {
-                $word_idx_score = max(1, 10 - $word_idx) * max(1, 10 - $word_idx); // au dela de 10 mots, on compte comme le 10e mot
+                $word_idx_score = pow(max(1, 10 - $word_idx) * $coef_pos_word, $pow_pos_word); // au dela de 10 mots, on compte comme le 10e mot
 
                 $w = $db->escape($word);
                 $w2 = $db->escape("%" . $word . "%");
 
                 $conditions_or = [];
                 $select_sums = [0];
-                foreach ($search_fields as $term_idx => $field) {
+                foreach ($search_fields as $field_idx => $field) {
                     $conditions_or[] = $field . " like " . $w2;
 
-                    $term_idx_score = max(1, 10 - $term_idx) * max(1, 10 - $term_idx); // au dela de 10 fields, on compte comme le 10e field
-                    $select_sums[] = "( if( locate(" . $w . ", ifnull(" . $field . ",'') ) > 0, 1, 0 ) * (1 / length(" . $field . ")) * " . $word_idx_score . " * " . $term_idx_score . " * greatest( 100 - locate(" . $w . ", ifnull(" . $field . ", '')), 1) )";
+                    $field_idx_score = pow(max(1, 10 - $field_idx) * $coef_pos_field, $pow_pos_field); // au dela de 10 fields, on compte comme le 10e field
+                    $select_sums[] = "( if( locate(" . $w . ", ifnull(" . $field . ",'') ) > 0, 1, 0 ) * pow(1 / length(" . $field . ") * " . $coef_length_field_value . ", " . floatval($pow_length_field_value) . ") * " . $word_idx_score . " * " . $field_idx_score . " * pow(greatest( 100 - locate(" . $w . ", ifnull(" . $field . ", '')), 1) * " . floatval($coef_pos_match) . ", " . floatval($pow_pos_match) . ") )";
+                    //$select_sums[] = "( if( locate(" . $w . ", ifnull(" . $field . ",'') ) > 0, 1, 0 ) * (1 / length(" . $field . ")) * " . $word_idx_score . " * " . $field_idx_score . "  )";
                 }
 
                 $word_condition = "(" . implode(" or ", $conditions_or) . ")";