2012-03-25 7 views
0

次のモデルの索引付けに関するソリューションを見つけることを試みています。 生徒には多くのレッスンがあり、各レッスンには1つの等級があります。ただし、レッスングレードはキーバリューペアです。Lucene.net KeyValuePairデータ型を注文して照会する方法

私の最初の質問は次のとおりです。

どのように私はLuceneのインデックスキー値すべきデータ? (その ように座標空間であってもよい?)

第二つ

私はLuceneので索引付けされたデータを持っていると仮定する。学生に質問するにはどうすればいいですか レッスン名ですが、グレードで注文します。

Student | Lesson | Grade 
---------------------------- 
John | Math  | A 
John | Chemistry | C 
Julie | Math  | F 
Julie | Chemistry | A 

iは、類似したクエリ何かのLuceneでのSQL句

答えて

2

、あなたのインデックスのインデックス文書は、文書のフィールドを持っている「グレードによってレッスン=数学のための学生からの選択」を作成することができます。

あなたの場合、3つのフィールド(学生、レッスン、およびグレード)のドキュメントがあります。これらのドキュメントでインデックスを作成します。

小さな例:

RAMDirectory ramDir = new RAMDirectory(); 

IndexWriter writer = new IndexWriter(ramDir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); 


Document doc = new Document(); 
Field studentName = new Field("student", "", Field.Store.YES, Field.Index.ANALYZED); 
Field lesson = new Field("lesson", "", Field.Store.YES, Field.Index.ANALYZED); 
Field grade = new Field("grade","", Field.Store.YES, Field.Index.NOT_ANALYZED); 

doc.Add(studentName); 
doc.Add(lesson); 
doc.Add(grade); 

studentName.SetValue("John"); 
lesson.SetValue("Math"); 
grade.SetValue("A"); 
writer.AddDocument(doc); 

studentName.SetValue("John"); 
lesson.SetValue("Chemistry"); 
grade.SetValue("C"); 
writer.AddDocument(doc); 

studentName.SetValue("Julie"); 
lesson.SetValue("Math"); 
grade.SetValue("F"); 
writer.AddDocument(doc); 

studentName.SetValue("Julie"); 
lesson.SetValue("Chemistry"); 
grade.SetValue("A"); 
writer.AddDocument(doc); 

writer.Commit(); 
IndexReader reader = writer.GetReader(); 
IndexSearcher searcher = new IndexSearcher(reader); 

PerFieldAnalyzerWrapper aw = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29)); 
aw.AddAnalyzer("grade", new KeywordAnalyzer()); 
Sort sort = new Sort(new SortField("grade", SortField.STRING)); 

QueryParser qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "lesson", aw); 

Query q = qp.Parse("chemistry"); 

TopDocs docs = searcher.Search(q, null, 100, sort); 

foreach (var scoreDoc in docs.ScoreDocs) 
{ 
    Console.WriteLine("Student: {0}; Lesson: {1}; Grade:{2}", 
     searcher.Doc(scoreDoc.doc).GetField("student").StringValue(), 
     searcher.Doc(scoreDoc.doc).GetField("lesson").StringValue(), 
     searcher.Doc(scoreDoc.doc).GetField("grade").StringValue()); 
} 

Console.WriteLine(""); 
Console.WriteLine("---"); 
Console.WriteLine(""); 

q = qp.Parse("Math"); 

docs = searcher.Search(q, null, 100, sort); 

foreach (var scoreDoc in docs.ScoreDocs) 
{ 
    Console.WriteLine("Student: {0}; Lesson: {1}; Grade:{2}", 
     searcher.Doc(scoreDoc.doc).GetField("student").StringValue(), 
     searcher.Doc(scoreDoc.doc).GetField("lesson").StringValue(), 
     searcher.Doc(scoreDoc.doc).GetField("grade").StringValue()); 
} 

Console.Read(); 

reader.Close(); 
searcher.Close(); 
writer.Close(); 

プリント:

Student: Julie; Lesson: Chemistry; Grade:A 
Student: John; Lesson: Chemistry; Grade:C 

--- 

Student: John; Lesson: Math; Grade:A 
Student: Julie; Lesson: Math; Grade:F 
関連する問題