1

Google検索に似た式をデータベーステーブルで検索するajaxスクリプトがあります。SELECTステートメントはLIKEを使用し、関連するフィールドで一致を検索します。最初は問題なく機能しましたが、コンテンツが大きくなるにつれて、ほとんどの検索文字列に一致するものが多すぎます。

たとえば、attを検索すると、attだけでなく、注目、attaboy、burattaなども表示されます。

グーグルのような優れた検索エンジンは、他の人によって精査された提案の中間テーブルを持っているようです。データを直接検索するのではなく、AT&Tなどの承認されたフレーズを検索し、結果の数を絞り込むことに成功しているようです。誰かがこのようなものをコーディングし、適切なdbaseスキーマとクエリを提案して関連する結果を取得しましたか?

今、私は次のような名前で直接名前のテーブルを検索しています

$sql = "SELECT lastname from people WHERE lastname LIKE '%$searchstring%'";

人々のほかに、次のような中間テーブルを作成する必要があると思います。

id|firstname|lastname|description

niceterms

id|niceterm|peopleid

次に、クエリは次のようになります。

$sql = "SELECT p.lastname,p.peopleid, n.niceterm, n.peopleid,
FROM `people` p
LEFT JOIN `niceterms` n
on p.id = n.peopleid
WHERE niceterm LIKE '%$searchterm%'";

..したがって、検索ボックスに何かを入力すると、より良い結果が得られる優れた検索用語が得られます。

しかし、nicetermsテーブルにデータを入力するにはどうすればよいですか。これは正しいアプローチですか?私はバックウェブやページランク全体を作成しようとはしていません。関連性のある検索結果を絞り込みたいだけです。

提案をありがとう。

4

1 に答える 1

0

Mysql の FULLTEXT 検索を参照してください。関連性に基づいて強力なクエリを作成できます。たとえば、結果にスコア行を作成できる BOOLEAN 検索を作成できます。スコアは、テキストが文字の組み合わせで始まるなどのルールに基づいています (はい? +2、いいえ、しかし組み合わせは含まれています: +1)

以下のコードは単なる別の列であり、3 つのルールが含まれています。

  • を行いますp1nameフィールドには Bl またはロックが含まれていますか? はいの場合 -> スコアを追加
  • を行います p1nameフィールドは Bl または rock のどちらかで始まりますか? はいの場合 -> スコアを追加
  • ですp1nameBlロックに等しい?はいの場合 -> スコアを追加

    マッチp1nameAGAINST('>Bl* >rock* >((+Bl*) (+rock*)) >("Bl rock")' IN BOOLEAN MODE) ASmatch

並べ替えるだけmatchで、最も関連性の高い検索が表示されます。order by を複数のステートメントと組み合わせて、以下のように制限を追加することもできます。

最新の日付、最も一致度の高い順に並べてから、同じスコアを持つ一致を文字の長さで並べ替えます

ORDER BY `date` DESC, `match` DESC, LENGTH(`p1`.`name`) ASC

上記のコードは、一般的なケースに基づいて何らかの形で関連する結果を作成することに注意してください。最適な結果/速度のためのアルゴリズムが信じられないほど優れているため、Google をコピーすることは不可能です。

FULLTEXT 検索が大変な場合は、タグ システムを作成してみてください。独自のタグの組み合わせでコンテンツにタグを付けると、より信頼性の高い検索結果が得られます

于 2013-01-30T01:42:47.320 に答える