うわー、私は大きな投稿を書いたばかりで、とても窒息してハングアップしました。再送信するために戻るボタンを押したとき、マークアップ エディターは空でした。ああああ。
では、また行きます…
スタック オーバーフローに関しては、 SQL Server 2005 の全文検索を使用していることが判明しました。
@Grant が推奨する OS プロジェクトについて:
- ※DotNetKicksはタグ付けにDB、全文検索にLuceneを利用しています。全文検索とタグ検索を組み合わせる方法はないようです
- Kiggは、検索クエリとタグ クエリの両方に Linq-to-SQL を使用しています。どちらのクエリも、Stories->StoryTags->Tags を結合します。
- どちらのプロジェクトも、誰もが一般的に推奨しているように、タグ付けに 3 テーブル アプローチを採用しています。
また、以前に見逃していた SO に関する他の質問もいくつか見つけました。
私が言及した各項目について私が現在行っていること:
- DB には、Entity、Tag、Entity_Tag の 3 つのテーブルがあります。DB を使用して次のことを行います。
- サイト全体のタグ クラウドを構築する
- タグでブラウズ (つまり、SO の/questions/tagged/ASP.NETのような URL )
- 検索には Lucene + NHibernate.Search を使用します
- タグは、Lucene によってインデックス付けされた TagString に連結されます。
- Lucene クエリ エンジン (AND / OR / NOT クエリ) をフルに活用できます。
- テキストの検索とタグによるフィルタリングを同時に行うことができます
- Lucene アナライザーは、より適切なタグ検索のために単語をマージします (つまり、"test" のタグ検索では、"testing" とタグ付けされたものも検索されます)。
- Lucene は潜在的に巨大な結果セットを返します。これを 20 個の結果にページ分割します
- 次に、NHibernate は、DB またはエンティティ キャッシュのいずれかから、ID によって結果のエンティティをロードします。
- したがって、検索結果が DB に 0 ヒットする可能性は十分にあります。
- まだこれを行っていませんが、別の DB ヒットを取得するのではなく、Lucene の TagString からタグ クラウドを構築する方法をおそらく見つけようとするでしょう。
- これもまだ行っていませんが、TagString を DB に保存して、さらに 2 つの結合を行わなくてもエンティティのタグ リストを表示できるようにします。
これは、エンティティのタグが変更されるたびに、次のことを行う必要があることを意味します。
- まだ存在しない新しいタグを挿入します
- EntityTag テーブルからの挿入/削除
- Entity.TagString の更新
- エンティティの Lucene インデックスを更新する
私のアプリケーションでは読み取りと書き込みの比率が非常に大きいため、これで問題ないと思います。本当に時間がかかるのは Lucene のインデックス作成だけです。Lucene はインデックスからの挿入と削除しかできないため、TagString を更新するためにエンティティ全体のインデックスを再作成する必要があります。そこまではドキドキしませんが、バックグラウンドスレッドでやれば大丈夫だと思います。
時が教えてくれる...