2012-03-20 8 views
1

.NETに推奨されているLucene(Lucene.NET)からリレーショナルデータベースへのマッピングフレームワークはありますか?Luceneから.NETへのリレーショナルマッピング

私は、リレーショナルデータベースからすべての検索をオフロードする検索目的でLuceneを使いたいと思っていました。

+0

luceneをリレーショナルデータにマップしたいですか?リレーショナル設計は重複排除に基づいていることは知っていますが、データ重複に基づいてルーゼンインデックスが+/-ですか?さらに、luceneに同じ名前の複数のフィールドが存在する可能性があります。 – Reactormonk

+0

私は理論的には単一のリレーショナルテーブルとして扱うことができるという文書をluceneに持っています。 – addisu

+0

luceneにスキーマはありません。 – Reactormonk

答えて

0

SimpleLuceneのようなオープンソースプロジェクトがいくつかありますが、いずれも使用していません。

luceneは単一のDBテーブル(i thought of, in lucene we have document that we can theoretically treat it as a single relational table)と考えることができます。だから私はあなたが単一のテーブルのための複雑なrelational database mapping frameworkを必要とするとは思わない。以下のような拡張メソッドを使用すると、Lucene.Netで遊ぶことができます。例えば

public static class LuceneExtension 
{ 
    public static void Index(this IndexWriter writer, object obj) 
    { 
     Document doc = new Document(); 

     obj.GetType() 
      .GetProperties() 
      .Select(p => new { Name = p.Name, Value = p.GetValue(obj, null) }) 
      .ToList() 
      .ForEach(f=>doc.Add(new Field(f.Name,f.Value.ToString(),Field.Store.YES,Field.Index.ANALYZED))); 

     writer.AddDocument(doc); 

    } 
} 

indexWriter.Index(new { text = "some text to index" , id = "555" }); 

は、インデックスフィールドtextid

0

との文書はまた、my blogにLucene2Objects hosted in Nugetと試料導入物品とを確認することができます。

[SearchableEntity(DefaultSearchProperty = "Text")] 
public class Message 
{ 
public int Id { get; set; } 

[Indexed] 
public string Text { get; set; } 

[Indexed] 
public string Title { get; set; } 

public DateTime Sent { get; set; } 

public DateTime? Read { get; set; } 
} 

をそして、このように保存します:基本的にはあなたがLuceneの抽象することができますし、オブジェクトの上だと思う、あなたもこのように、あなたのドメインエンティティに注釈を付けることができ

var iWriter = new IndexWriter(Environment.CurrentDirectory + @"\index"); 
var message = new Message { Id = 12, Sent = DateTime.Now, 
          Text = "Some text on the message!", 
          Title = "This is the title" 
       }; 
iWriter.AddEntity(message); 
iWriter.Close(); 

そして、このようなあなたのインデックスを検索します

var iReader = new IndexReader(Environment.CurrentDirectory + @"\index"); 
var messages = iReader.Search<Message>("text"); 

foreach (var message in messages) { 
Console.WriteLine("Message: {0}", message.Title); 
} 

答えが長すぎる場合は申し訳ありません。 私は助けることができますように!

免責事項:あなたが想像していたように、私はライブラリを書きました。

+0

こんにちはDavid、これは基本的に私が探していたものでした。また、検索可能なEntityクラスに「テーブル名」を追加した同様のライブラリを作成しました。私は車輪を再発明するかもしれないと思っているだけで、テストされた、準備が整った図書館があれば、あまりにも多くの時間を費やしたくないと思って、このトレッドを上げました。しかし、私たちは同じページにいると思います。:) – addisu

+0

MongoDBやNoSQLの代替案を使用する予定がある場合、テーブルのコンセプトにデザインを縛っている点を除いて、ちょっといいです。いくつかのポイント.. –

関連する問題