2012-03-25 22 views
0

我試圖找到一個關於索引 - 查詢以下模型的解決方案: 學生有很多課程,每個課程有一個等級。然而,課程成績是關鍵值對。Lucene.net如何訂購和查詢KeyValuePair數據類型

我的第一個問題是:

我應該如何索引Lucene的那個鍵值的數據? (其狀如 座標可以是空間?)

第二個是

假設我有在lucene的一個索引數據。我如何查詢學生,由 課程名稱,但按等級排序。

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

我可以創建類似查詢的東西SQL語句

回答

2

在Lucene的,你在指標指數的文件,文件都有域「從學生那裏按年級課程=數學順序選擇」。

就你而言,你將擁有一個包含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