Точные фразы поиска по ключевым словам - PullRequest
0 голосов
/ 30 мая 2011

Я использую поисковую систему MySQL / PHP.

Я некоторое время искал форумы, чтобы попытаться найти решение этой проблемы.

Если у меня есть ключевые слова для 3 отдельных изображений с пометкой:

  • # 1 чистый черный
  • # 2 чистый белый
  • # 3 чистый зеленый

Если я введу «чистый белый» в поле поиска, все 3 изображения появятся, потому что все они имеют слово «чистый».

Есть ли обходной путь или код, который я могу добавить, чтобы он соответствовал только точным поисковым фразам при использовании нескольких ключевых слов для поиска?

Это код:

<?php
  //get data
  $button = $_GET['submit'];
  $search = $_GET['search'];

  $s = $_GET['s'];
  if (!$s)
    $s = 0;

  $e = 10; 

  $next = $s + $e;
  $prev = $s - $e;

  if (strlen($search) <= 2)
    echo "Must be greater then 3 chars";
  else {
    echo "<br /><table><tr><td><img src='juzzy.jpg' /></td><td><form action='search.php' method='GET'><input type='text' onclick=value='' size='50' name='search' value='$search'> <input type='submit' name='submit' value='Search'></form></td></tr></table>";

  //connect to database
  mysql_connect("","","");
  mysql_select_db("");

  //explode out search term
  $search_exploded = explode(" ",$search);

  foreach($search_exploded as $search_each) {
    //construct query
    $x++;
    if ($x == 1)
      $construct .= "keywords LIKE '%$search_each%'";
    else
      $construct .= " OR keywords LIKE '%$search_each%'";    
    }

    //echo outconstruct
    $constructx = "SELECT * FROM searchengine WHERE $construct";

    $construct = "SELECT * FROM searchengine WHERE $construct ORDER BY keywords LIMIT $s,$e ";
    $run = mysql_query($constructx);

    $foundnum = mysql_num_rows($run);
    $run_two = mysql_query("$construct");

    if ($foundnum == 0)
      echo "No results found for <b>$search</b>";
    else {
      echo "<table bgcolor='#0000FF' width='100%' height='1px'><br /></table><table bgcolor='#f0f7f9' width='100%' height='10px'><tr><td><div align='right'>Showing 1-10 of <b>$foundnum</b> results found for <b>$search.</b></div></td></tr></table><p>";

   while ($runrows = mysql_fetch_assoc($run_two)) {
    //get data
    $title = $runrows['title'];
    $desc = $runrows['description'];
    $url = $runrows['url'];

    echo "<table width='300px'>
    <h4><a href='http://$url'><b>$title</b></a><br />
    $desc<br>
    <font color='00CC00'>$url</font></table></h4>";
   }
?>

<table width='100%'>
<tr>
<td>
<div align="center">

<?php
if (!$s<=0)
 echo "<a href='search.php?search=$search&s=$prev'>Prev</a>";

$i =1; 
for ($x=0;$x<$foundnum;$x=$x+$e) {    
 echo " <a href='search.php?search=$search&s=$x'>$i</a> ";    
 $i++;    
}

if ($s<$foundnum-$e)
  echo "<a href='search.php?search=$search&s=$next'>Next</a>";
}
}  


?>
</div>
</td>
</tr>
</table>

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Не используйте нечеткие LIKE %% запросы, запрос по keywords = '$search'.

0 голосов
/ 30 мая 2011

Не взрывайте строку поиска.Это заставит его использовать полную строку поиска в качестве поиска, а не любую из частей.

Или вы можете изменить свой оператор OR в своей конструкции на AND, и таким образом для этого потребуются всеОднако слова должны появляться независимо от порядка.

...