2011-12-07 19 views
0

表構造:PHPのmysqlの検索全文

Companies: id, name, city, branch, keywords, country 

キーワードフィールドが一緒に名前の都市と分岐が含まれている、私は今ちょうどたとえば、ワイルドカードとLIKEを使用する「%ミュージックロンドン%」は「ロンドンmusicfactory」を返します

しかし、ユーザがVini & Magraineをロンドン(レストラン)で検索したいとして、入力が 'vini londen'であった場合、それは見つからなかったが、ユーザが 'magraine london'を挿入した場合発見されます。

問題はprobキーワードの順番です。今ではフルテキスト検索に変換する予定です。キーワードフィールドにインデックスを作成しました。また、キーワードフィールドはスマートなアイデアですか?それが正しい結果を返すされていませんが

SELECT id, name, branch FROM companies WHERE MATCH(keywords) AGAINST(? IN BOOLEAN MODE) AND country = ? LIMIT 7 

私の主な質問は、私はこのクエリで全文検索を作成し、ありますか?すべての実用的なソリューションの中で最も優れたものは何ですか?

読んでいただきありがとうございます。

答えて

1

これは、オペレータに対する標準一致の良好なブレークダウンです。それはあなたのクエリを作成する方法を明確にする必要があります

http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

企業テーブルの「キーワード」欄は良いアイデアである場合、私が正しくあなたが求めているあなたの質問を読んでいる場合 - 私はそれがどのように依存して言いますそれを埋めることは間違いない。前に関連するフィールドのコレクションからのすべての標準テキストを含む集合的なキーワード列を使用し、うまくいきました。

カップル他のノート -

1)私はあなたのLIKEの例では、欠陥があると思うし、そのルールによって、私はあなたがどんな結果を得た驚いています。 %は指向性のワイルドカードです。 '%music london%'は 'musicfactory london'を返してはいけません。それを動作させるにはWHERE(keywords LIKE '%music%' AND keywords LIKE '%london%')として書き出す必要があります。

2)全文検索はMyISAMテーブルでのみ使用できます。したがって、innoDBに依存するフレームワークを使用する場合は、リレーショナルの回避策を作成する必要があります。 (またはinnoDBを使用するその他の理由)

3)のmatchは、デフォルトのini設定のデフォルトの最小文字数が4です。あなたの設定でそれを低く設定し、より低い文字の範囲が必要な場合はフルテキストインデックスを再構築する必要があります。 「芸術」のような言葉を考えてみましょう。なぜこの価値を下げることが示唆されますか?さもなければ、より短い文字列のための一致モードとLIKEモードの間で切り替える条件を書く必要があります。

+0

ここであなたが言ったことを再確認できますか?データベースはinnoDBですか?一致する場合は、あなたのために動作しませんあなたは回避策を検討する必要があります。確認できますか?それ以外に、自分で定義した一連の演算子に基づいてクエリ文字列を作成することができます。正規表現を使用すると、検索用語の中の特定のもの(例:引用符やコンマなど)を簡単に特定し、それを使って用語との一致を変更する必要があるかどうかを判断することができます。 –