im, создавая функцию поиска, которая позволит пользователю вводить вопрос, мой код будет соответствовать как можно большему количеству слов с вопросами, уже содержащимися в моей базе данных MySQL, и отображать первые 5 результатов в зависимости от количества слов, которые соответствуют вопрос.
Я использую функцию count(
), которая подсчитывает количество совпадающих слов, однако в тот момент, когда отображаемые результаты отображаются в качестве первых 5 результатов в базе данных, которые имеют совпадение 50% слов или больше. Я хочу, чтобы результаты отображались как наивысшее совпадение в первую очередь и работали вниз для каждого результата в базе данных, но отображали только верхнюю часть 5. Вот код, который у меня есть
<?php include("config.php"); $search_term = filter_var($_GET["s"], FILTER_SANITIZE_STRING); //User enetered data $search_term = str_replace ("?", "", $search_term); //remove any question marks from string $search_count = str_word_count($search_term); //count words of string entered by user $array = explode(" ", $search_term); //Seperate user enterd data foreach ($array as $key=>$word) { $array[$key] = " title LIKE '%".$word."%' "; //creates condition for MySQL query } $q = "SELECT * FROM posts WHERE " . implode(' OR ', $array); //Query to select data with word matches $r = mysql_query($q); $count = 0; //counter to limit results shown while($row = mysql_fetch_assoc($r)){ $thetitle = $row['title']; //result from query $thetitle = str_replace ("?", "", $thetitle); //remove any question marks from string $title_array[] = $thetitle; //creating array for query results $newarray = explode(" ", $search_term); //Seperate user enterd data again foreach($title_array as $key => $value) { $thenewarray = explode(" ", $value); //Seperate each result from query $wordmatch = array_diff_key($thenewarray, array_flip($newarray)); $result = array_intersect($newarray, $wordmatch); $matchingwords = count($result); //Count the number of matching words from //user entered data and the database query } if(mysql_num_rows($r)==0)//no result found { echo "<div id='search-status'>No result found!</div>"; } else //result found { echo "<ul>"; $title = $row['title']; $percentage = '.5'; //percentage to take of search word count $percent = $search_count - ($search_count * $percentage); //take percentage off word count if ($matchingwords >= $percent){ ?> <li><a href='<?php echo $row['url']; ?>'><?php echo $title ?><i> No. matching words: <?php echo $matchingwords; ?></i></a></li> <?php $count++; if ($count == 5) {break; } }else{ } } echo "</ul>"; } ?>
в<?php include("config.php"); $search_term = filter_var($_GET["s"], FILTER_SANITIZE_STRING); //User enetered data $search_term = str_replace ("?", "", $search_term); //remove any question marks from string $search_count = str_word_count($search_term); //count words of string entered by user $array = explode(" ", $search_term); //Seperate user enterd data foreach ($array as $key=>$word) { $array[$key] = " title LIKE '%".$word."%' "; //creates condition for MySQL query } $q = "SELECT * FROM posts WHERE " . implode(' OR ', $array); //Query to select data with word matches $r = mysql_query($q); $count = 0; //counter to limit results shown while($row = mysql_fetch_assoc($r)){ $thetitle = $row['title']; //result from query $thetitle = str_replace ("?", "", $thetitle); //remove any question marks from string $title_array[] = $thetitle; //creating array for query results $newarray = explode(" ", $search_term); //Seperate user enterd data again foreach($title_array as $key => $value) { $thenewarray = explode(" ", $value); //Seperate each result from query $wordmatch = array_diff_key($thenewarray, array_flip($newarray)); $result = array_intersect($newarray, $wordmatch); $matchingwords = count($result); //Count the number of matching words from //user entered data and the database query } if(mysql_num_rows($r)==0)//no result found { echo "<div id='search-status'>No result found!</div>"; } else //result found { echo "<ul>"; $title = $row['title']; $percentage = '.5'; //percentage to take of search word count $percent = $search_count - ($search_count * $percentage); //take percentage off word count if ($matchingwords >= $percent){ ?> <li><a href='<?php echo $row['url']; ?>'><?php echo $title ?><i> No. matching words: <?php echo $matchingwords; ?></i></a></li> <?php $count++; if ($count == 5) {break; } }else{ } } echo "</ul>"; } ?>
На следующем рисунке показано, что происходит, когда я ищу «Как сделать свой собственный сайт» в строке поиска. У меня уже есть несколько вопросов в базе данных для тестирования, которые являются одинаковыми вопросами, и одна последняя запись является точным совпадением с вопросом, который я задал, но поскольку в настоящее время он показывает их как первые 5 математических результатов, он игнорирует полное совпадение. Вот результаты этого поиска.
Я добавил немного кода, который показывает, сколько совпадений слов есть в каждом вопросе, так что вы можете видеть, что он работает немного лучше. Также его совпадение, что его в порядке возрастания, он показывает первые 5 результатов сопоставления в базе данных.
Какой код мне нужно добавить к этому, чтобы упорядочить его так, чтобы он отображал самое близкое соответствие от всей базы данных, а затем второе лучшее совпадение, третье и т. Д. …?
Либо вы используете вложенный SQL-запрос, где вы можете заказать по счету или загрузить значения в массив php-массива, а затем отсортировать массив. Использование SQL очень эффективно && быстрее.
Сортировка массивов с несколькими размерами
select column1, column2,..., LENGTH(titlecolumn) - LENGTH(REPLACE(titlecolumn, '$search term', '')) AS nummatchwords from posts where " . implode(' OR ', $array) order by nummatchwords;