1

検索ルーティングを変更しようとしています。アーティストとタイトルの 2 つのフィールドがあります。たとえば、ふりをしている Foo Fighters を検索すると、結果が得られませんが、個別に検索すると結果が得られます。どんな助けでも大歓迎ですありがとう。

  $arraySearch = explode(" ", $searchvalue);
  $arrayFields = array(0 => "Artist", 1 => "Title");
  $countSearch = count($arraySearch);
  $a = 0;
  $b = 0;
  $query = "SELECT * FROM ".$table." WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.")";
  $query_result = mysql_query($query);
  echo '<h1>Your Search Results</h1>'."\n\n";
  if(mysql_num_rows($query_result) < 1)
  {
    echo '<p>No matches found for "'.$searchvalue.'"</p>';
  }
  else
  {
    echo '<p>Search Results for "'.$searchvalue.'":</p>'."\n\n";
    while($row = mysql_fetch_assoc($query_result))
    {
      // output

    }
  }
4

3 に答える 3

3

この検索機能は非常に非効率的です。ワイルドカード%blah%で検索しているため、レコードを見つけるには完全なテーブル スキャンを実行する必要があります。つまり、100 万件のレコードがある場合、検索結果を見つけるには 100 万件すべてのレコードを読み取る必要があります。大きなテーブルを持つビジーなサイトでは、これによりパフォーマンスとデータベース サーバーが停止する可能性があります。

テーブルに MyISAM エンジンを使用している場合は、artist 列と title 列にFULLTEXTインデックスを追加してから、次のように全文検索を実行することをお勧めします。

SELECT * FROM `table` WHERE
MATCH(`artist`, `title`)
AGAINST('foo fighters the pretender');

OPが書いたように、これは検索クエリの一致関連性でソートするクエリです

$search = $db->escape('foo fighters the pretender');

$query = "SELECT *,
          MATCH(Artist, Title) AGAINST('$search' IN BOOLEAN MODE) AS relevance
          FROM table
          WHERE
            MATCH (Artist, Title)
            AGAINST('$search' IN BOOLEAN MODE)
          ORDER BY relevance DESC";
于 2012-07-25T00:07:19.947 に答える
1

これを変える:

$query = $query." AND ";

これに:

$query = $query." OR ";

本質的にあなたは言っていSELECT... WHERE (field1 like 'foo%' AND field1 like 'bar%')ます。まったく同じ単語でない限り、field1 が両方の単語に似ている行は見つかりません。それは、行 1 と 2 をプルするSELECT ... WHERE id=1 AND id=2ところで、結果をプルしないと言っているようなものです。SELECT ... WHERE id=1 OR id=2

于 2012-07-25T00:00:19.920 に答える
0

クエリの括弧を閉じた後、var_dump($query) を配置して、何が起こっているのかを理解してください。

例: 次のコードの出力: string(123) "SELECT * FROM WHERE (Artist LIKE '%foo%' AND Artist LIKE '%fighters%') OR (Title LIKE '%foo%' AND Title LIKE '%fighters%' )"

<?php

$searchvalue = 'foo fighters';

$arraySearch = explode(" ", $searchvalue);
  $arrayFields = array(0 => "Artist", 1 => "Title");
  $countSearch = count($arraySearch);
  $a = 0;
  $b = 0;
  $query = "SELECT * FROM ".$table." WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.")";

  var_dump($query);
?>
于 2012-07-25T00:08:06.140 に答える