1

オートコンプリート フォーム (jquery Axax + PHP) で使用するクエリを作成するときの SQL のベスト プラクティスについて質問があります。

次のように仮定します。

  • 本のタイトルのデータベースがあります
  • 「ライフ オブ パイ」など、タイトルに定冠詞 (「The」または「A」) が付いていない本もあります。
  • 「The Catcher in the Rye」のように、タイトルに定冠詞 (「The」または「A」) が付いている本もあります。

その結果、ユーザーは書籍のタイトルを最初に「The」を使用するか単に「The」を省略して入力し、定冠詞を付けずにクエリを開始します。

次の 3 つのクエリが考えられます。

SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string'

また

SELECT 'title' FROM 'books' WHERE 'title' LIKE '$string%'

また

SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string%'

最初のクエリ メソッド (% が文字列の前にある) を使用すると、文字列の前のワイルドカードが誤って動作するように見えるため、結果を取得するのが困難です。

2 番目のクエリを使用する場合、タイトルの前に「The」を使用すると完全一致が優先されるようです。したがって、「The Catcher in the Rye」を検索しているユーザーは本を見つけることができますが、「Catcher in the Rye」を検索しているユーザーは見つかりません。

文字列の前後にワイルドカードがあるため、最後の結果が最適です。ただし、最長のオートコンプリート リストも表示されます。ユーザーは、検索結果を絞り込むために数文字を入力する必要があります。

より効率的なクエリの実装に関するアイデアはありますか? それとも、3 番目のオプションが最適なオプションですか (本のタイトルで定冠詞を分離することは現実的ではないことを考えると?

前もって感謝します、

4

5 に答える 5

2

正規表現を使用して検索を行うことができ (クエリ結果はすぐに表示されます)、結果に制限を追加することを忘れないでください。

小さな例

SELECT title FROM books WHERE title REGEXP '$string' LIMIT 20

または、単語の境界を使用できます

SELECT title FROM books WHERE title REGEXP '[[:<:]]$string[[:>:]]' LIMIT 20

ドキュメントを参照してくださいhttp://dev.mysql.com/doc/refman/5.5/en/regexp.html

于 2013-03-11T20:08:57.050 に答える
1
$query = mysqi_query("SELECT title FROM books WHERE title REGEXP '$string'");
if($query->num_rows() == 0) {

     //First remove all the stop words like for, the, of, a from the search string.
     $stopWords = array('/\bfor\b/i', '/\bthe\b/i', '/\bto\b/i', '/\bof\b/i','/\ba\b/i');
     $string = preg_replace($stopWords, "", $string);

     //Then, use 
     mysqli_query("SELECT title FROM books WHERE title REGEXP '$string'");
}
于 2013-03-11T20:15:32.363 に答える
1

また、一致するはずの「Catcher Rye」の検索を許可することも検討してください。

この場合、タイトルの各単語とユーザーが入力した単語をトークン化し、最適な一致を見つけます。

それ以外の場合は、たとえば 4 文字以上が入力された後にのみオートコンプリートし、オプション 3 を使用します。

于 2013-03-11T19:52:36.730 に答える
1

文字列の両側にワイルドカードを使用して 3 番目の方法を使用することをお勧めします。返される結果セットのサイズが心配な場合は、おそらく結果を特定の数に制限してください。ユーザーが入力すると、リストは自然に小さくなり、より具体的になります。

于 2013-03-11T19:51:56.517 に答える
0

候補の数が気になる場合は、変更イベントを変更して、フィールドに最小限の文字数を入力した後にのみ候補を取得するようにできますか?

于 2013-03-11T19:50:22.280 に答える