編集:Luceneを使用できます。Lucene.netでこれを行う方法の説明は次のとおりです。Luceneの基本は次のとおりです。
- ドキュメント-Luceneのストレージユニットです。これは、データベースレコードにいくぶん似ています。
- フィールド-Luceneの検索ユニット。データベース列に類似しています。Luceneは、クエリを取得してフィールドと照合することにより、テキストを検索します。検索を有効にするには、フィールドにインデックスを付ける必要があります。
- トークン-Luceneの検索アトム。通常は単語、場合によってはフレーズ、文字、または数字。
- アナライザー-フィールドをトークンに変換するLuceneの一部。
Lucene.netインデックスの作成と使用については、このブログ投稿をお読みください。
ブログの投稿にタグを付けていると思います。私が完全に間違っているなら、そう言ってください。タグを検索するには、タグをLuceneエンティティとして、つまり「タグ」フィールド内のトークンとして表す必要があります。
そのための1つの方法は、ブログ投稿ごとにLuceneドキュメントを割り当てることです。ドキュメントには、少なくとも次のフィールドがあります。
- id:ブログ投稿の一意のID。
- コンテンツ:ブログ投稿のテキスト。
- タグ:タグのリスト。
インデックス作成:投稿にタグを追加したり、タグを削除したり、編集したりするときはいつでも、投稿にインデックスを付ける必要があります。アナライザーは、フィールドをトークン表現に変換します。
Document doc = new Document();
doc.Add(new Field("id", i.ToString(), Field.Store.YES, Field.Index.NO));
doc.Add(new Field("content", text, Field.Store.YES, Field.Index.TOKENIZED));
doc.Add(new Field("tags", tags, Field.Store.YES, Field.Index.TOKENIZED));
writer.AddDocument(doc);
残りの部分は検索です。このためには、QueryParserを作成し、次のようなクエリ文字列を渡す必要があります。
QueryParser qp = new QueryParser();
Query q = qp.Parse(s);
Hits = Searcher.Search(q);
sに必要な構文は次のとおりです。
tags: apples tags: carrots
リンゴやニンジンを検索するには
tags: carrots NOT tags: apples
の構築の詳細については、Luceneクエリパーサー構文を参照してください。