2

私は漫画のウェブサイトを構築していて、検索を実装しました。検索は元々画像タイトルを使用していました...これはうまくいきました:

if (strtolower($input)==strtolower(substr($row['title'],0,strlen($input)))) {

でも今はタイトルを覚えていない人が多い気がします。そこで、データベースに「keywords」、varchar [55] ...という列を追加しました。テストエントリは、文字列「five、second、rule、food、rules」です。置き換えることができ、検索は引き続き機能すると$row['title']思いました。$row['keywords']

「five、seco ...」のように文字列の先頭から検索を開始すると機能しましたが、「second」や「rule」などの文字列の途中から検索を開始すると機能しませんでした。

それをどのように機能させることができるかについてのアイデアはありますか?

ありがとう!

4

4 に答える 4

7

コミックのコラムでそれを行うと、正規化が破られるため、涙が出るだけです。エントリごとに1つの単語を含むキーワードテーブルを作成してから、キーワードを漫画に一致させるピボットテーブルを作成する必要があります。次に、参加して、一致するすべての漫画を見つけることができます。

セットアップはより手間がかかりますが、長期的にはより柔軟になります。

編集:

キーワードテーブル:

id     keyword
1      x-men
2      action
3      mystery
4      batman
etc.

comic_keywordテーブル

comic_id    keyword_id
45          3
678         1
678         2
77          3
77          4
etc.

2番目のテーブル(ピボットテーブル)は、コミックのIDをそれらが関連付けられているキーワードのIDと一致させます。これは、ほとんどの場合、多対多の関係をモデル化する必要がある数です。

于 2012-11-17T20:31:46.663 に答える
4

簡単な解決策は、stripos代わりに次を使用することです。

if(stripos($input, $row['title']) !== false) {
    // row matches
}

ただし、これは実際には良い解決策ではありません。フィルタリングをデータベースにオフロードする方がはるかに優れているため、一致しない行がフロントエンドに移動する必要はまったくありません。キーワードをコンマ区切りのフィールドとして保持する場合は、LIKEまたはREGEXPツールを選択することをお勧めします。コミックとキーワードの1対多の関係が別のcomic_keywordsテーブルでモデル化されるようにデータベーススキーマを正規化すると、マッチングがさらに簡単になります。

たとえば、にとがcomicあり、idcomic_keywordsがあるcomic_idと仮定すると、keyword一致する漫画を選択できます。

SELECT DISTINCT(comic_id) FROM comic_keywords WHERE keyword = 'blah'
于 2012-11-17T20:30:57.817 に答える
1

その場で列を分割できます。

if (in_array(strtolower($input), explode(', ', $row['title']))) {
  /* found it */
}
于 2012-11-17T20:33:19.150 に答える
0

Sphinxまたは(可能性は低いですが、セットアップが簡単な)MySQL全文検索が必要なようです。

于 2012-11-17T20:31:18.750 に答える