3

必要に応じてここからアクセスできる YouTube の素晴らしいビデオのおかげで、php 検索エンジンを作成することができました。以下はコードです:

<?php


//connected to DB

      foreach (array('questioncontent') as $varname) {
        $questioncontent = (isset($_GET[$varname])) ? $_GET[$varname] : '';
      }

?>

<form action="previousquestions.php" method="get">
      <p>Search: <input type="text" name="questioncontent" value="<?php echo $questioncontent; ?>" /></p>
      <p><input id="searchquestion" name="searchQuestion" type="submit" value="Search" /></p>
      </form>

<?php 

if (isset($_GET['searchQuestion'])) {

$searchquestion = $questioncontent;
$terms = explode(" ", $searchquestion);

              $questionquery = "SELECT * FROM Question WHERE ";

              foreach ($terms as $each){
               $i++;   

               if ($i == 1){
               $questionquery .= "QuestionContent LIKE '%$each%' ";
          } else{
               $questionquery .= "OR QuestionContent LIKE '%$each%' ";

              }

          }

      $questionnum = mysql_num_rows($questionresult = mysql_query($questionquery));

        else if($questionnum !=0){

      $output = "";
$output .= "
    <table border='1'>
      <tr>
      <th>Question</th>
      </tr>
";
        while ($questionrow = mysql_fetch_array($questionresult)) {
$output .= "
      <tr>
      <td>{$questionrow['QuestionContent']}</td>
      </tr>";
        }
        $output .= "        </table>";

        echo $output;

  }

}

  mysql_close();

?>

ここで、可能であれば検索結果をどのように並べ替えることができるかについて質問があります。データベースに次の 3 つのステートメントがあるとします。

My name
My name is Mayur Patel
My name is Patel

ここで、検索ボックスに「name Mayur Patel」と入力すると、最初にこれらのキーワードをすべて含む行が表示され、次にそれらの行がすべて表示された後にそれらの行が表示されるように結果を並べ替える必要があります。これらのキーワードの一部が含まれているため (キーワードを 1 つずつノックアウト)、検索結果は以下の順序で表示されます。

My name is Mayur Patel (all keywords match in this phrase)
My name is Patel (2 keywords match this phrase which are 'name' and 'Patel')
My name (1 keyword match this phrase which is 'name')

データベース内のフレーズ内で一致するキーワードの数に応じて検索結果を並べ替えることができるかどうかを知りたいですか?

4

1 に答える 1

7

現在、組み込みコードのクエリは、完了すると次のようになります。

SELECT * FROM Question WHERE
QuestionContent LIKE '%name%'
OR QuestionContent LIKE '%Mayur%'
OR QuestionContent LIKE '%Patel%'

探している結果を得るには、次のような並べ替え句を追加します。これは、キーワードのリストから同様の方法で生成されます。

ORDER BY
IF(QuestionContent LIKE '%name%',1,0)+
IF(QuestionContent LIKE '%Mayur%',1,0)+
IF(QuestionContent LIKE '%Patel%',1,0) DESC

基本的に、一致するキーワードの数をカウントし、一致する場合はキーワードカウントに貢献し、それ以外の場合は0を貢献します。したがって、最終的には、カウントとして3、2、1が生成され、次のように降順で並べ替えられます。DESCそのため、一致するキーワードの数が最も多いエントリが最初に表示されます。

デモ:http ://www.sqlfiddle.com/#!2 / eaabc / 2


編集:約束通り、PHPコードに実装する方法は次のとおりです。

$questionquery = "SELECT * FROM Question WHERE ";
foreach ($terms as $each) {
    $i++;   

    if ($i == 1){
        $questionquery .= "QuestionContent LIKE '%$each%' ";
    } else {
        $questionquery .= "OR QuestionContent LIKE '%$each%' ";
    }
}

$questionquery .= " ORDER BY ";
$i = 0;
foreach ($terms as $each) {
    $i++;

    if ($i != 1)
        $questionquery .= "+";
    $questionquery .= "IF(QuestionContent LIKE '%$each%',1,0)";
}
$questionquery .= " DESC";
于 2012-05-24T20:14:11.810 に答える