2009-05-31 21 views
2

私はDjangoを使ってWebアプリケーションを開発しています。すぐに検索機能を追加する必要があります。検索は2つのモデルに対して実装されます.1つはauthユーザークラスの拡張であり、もう1つはフィールドname,tagsdescriptionです。だから私は、テキストを検索するという文脈ではあまり恐ろしいものはないと思う。Djangoの検索機能

私はSQLiteを使用していますが、データベースの特定の作業が行われていないため、私は実稼働環境でデータベースを使用する自由があります。私はPostgreSQLまたはMySQLの中から選ぶことを考えています。

私は検索ソリューションについてインターネット上のいくつかの記事を見てきましたが、私は単純なケースについて意見を得たいと思います。ここに私の質問があります:

  1. 私の場合、過剰入力ですか?

  2. データベースの全文検索のサポートに頼る方が良いですか?もしそうなら、私はどのデータベースを使うべきですか?

  3. は、私はそのようなWhooshSphinx、またはXapianとして、外部検索ライブラリを使用する必要がありますか?もしそうなら、どちらですか?

EDIT: tags M2M関係に着座(ジャンゴ-タグ付けアプリから)Tagfieldあります。 descriptionは、HTMLを保持するフィールドで、max_lengthは1024バイトです。

+1

私のエクスペディエンスは外部検索ライブラリを使用しているため、最初は必要以上に複雑です。簡単な検索のためにicontainsのフィルタを使用してみてください(またはgoogleを使用してください) – Jiaaro

答えて

5

そのフィールドがtagsの場合は、アイテムの複数のタグを連結する文字列を格納することを意味していると考えられます。フルテキスト検索が必要な場合があります。むしろ、アイテムとタグテーブル(アイテムテーブルとタグテーブルの主キーである2つの外部キーを使用して、別のテーブル、ItemTagなど)に多数の関係を持たせる必要があります。

descriptionでフルテキスト検索が必要かどうかわかりません。私は、それが何であるかについての兆候がなく、MySQL 5.1とPostgreSQL 8.3が提供する妥当ではあるが初歩的な全文検索が必要かどうか、より強力なもの、例えばスフィンクス...あなたのアプリのコンテキストとフルテキスト検索を検討する理由についてもう少し話してください。

編集:フルテキスト検索の唯一の可能性があるのはdescriptionである可能性があり、MySQL 5.1またはPostgreSQL 8.3のいずれかがうまく機能するには十分に限られているようです。私は、PostgreSQLのスイートスポットを持っています(私もMySQLでも熟練していますが)、それは全文検索の問題に特に関連していない一般的な好みです。 This blogは、PostgreSQLを好む理由の1つを提供しています。フルテキスト検索は可能ですが、MySQLフルテキストインデックス作成はInnoDB [[もちろんスフィンクスを追加する場合を除いて]]ではなく、MyISAMテーブルでのみ機能します。 PostgreSQLとLuceneのフルテキスト検索についてはthis follow-onをご覧ください)。それでも、DBを選ぶ際には他にも考慮すべき点があります。私はあなたがどちらかといえばひどくやっているとは思っていません(フルテキストプラストランザクションのためにスフィンクスを追加する必要がない限り大きな問題です)。

+0

Alex、私は編集を行い、あなたが求めた情報を与えました。ありがとう。 – shanyu

+0

アレックス、とても助けてくれてありがとう。私はトランザクションなしではできないので、MyISAMでMySqlを使用することは問題になりません。これは、私自身の検索機能を備えたPostgre、MySql +サードパーティのフルテキストライブラリ、Postgre +サードパーティのフルテキストライブラリ、これらのオプションを私に残します。私はまた、Mysqlに対してPostgreを支持します。それはPostgre +ライブラリに対するPostgreです。何を指示してるんですか? – shanyu

+0

サードパーティ製のアドオンをインストールして維持するという面倒な作業が必要なのではないかと思います。 PostgreSQL 8.3のネイティブ機能に加えて)だから、私は "裸の" PGSQL 8.3に行きます。 –

0

外部ライブラリが必要かどうかは、必要に応じて異なります。どれくらいのトラフィックについて話していますか?外部ライブラリは、パフォーマンスに関しては一般的に優れていますが、いつものように利点と欠点があります。私はdjango-sphinxプラグインでSphinxを使用しています。あなたが多くの検索をするなら、それをお勧めします。

+0

私は検索が主なものになるとは思わないので、パフォーマンスよりも開発/デプロイの容易さにもっと興味があります。 – shanyu

0

Haystack有望です。また、バックエンドでWhooshをサポートしています。

1

DjangoはQuerySetフィルタでfull text searchingをサポートしています。今、あなただけの検索を必要とする二つのモデルを持っている場合は、単に両方のフィールドを検索し表示を行います。必要に応じて

search_string = "+Django -jazz Python" 
first_models = FirstModel.objects.filter(headline__search=search_string) 
second_models = SecondModel.objects.filter(headline__search=search_string) 

あなたはさらに、結果は一意であることを確認するためにそれらをフィルタリングすることができます。

さらに、正規表現はデリミタやマークアップの処理方法を正確にフィルタに指示できるので、htmlフィールドやタグを扱う方が良いかもしれないregex filterがあります。

+0

ありがとうございました。フルテキスト検索のサポートについては、「これはMySQLでのみ利用可能であり、フルテキストインデックスを追加するにはデータベースを直接操作する必要があることに注意してください。たぶんそれは非常に良い選択肢ではありません。一方、正規表現フィルタは興味深く、確かにチェックの価値があります。 – shanyu

+0

本当の全文検索が必要な場合は、それをmySQLに追加することは構成上の問題です。 – Soviut

+0

docsは 'これはMySQLでのみ利用可能であり、フルテキストインデックスを追加するためにデータベースを直接操作する必要があることに注意してください。私はdjangoでsqlite3とFTSを使いたいと思います。どうすればいいのか教えてください。 –