2012-03-25 7 views
0

Ich versuche, eine Lösung über Indexing-Abfrage folgenden Modells zu finden: Student hat viele Lektionen und für jede Lektion gibt es eine Note. Lesson-Grade ist jedoch ein Schlüsselwertpaar.Lucene.net wie zu bestellen und abzufragen KeyValuePair Datentyp

meine erste Frage ist:

wie soll ich Index in Lucene, die Daten KEYVALUE? (Es ist wie ein koordinieren kann räumlich sein?)

zweite ist

nehme ich ein indizierten Daten in lucene haben. Wie kann ich Studenten abfragen, durch Lesson Name, aber nach Grad sortiert.

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

mache ich eigentlich eine Abfrage etwas ähnliches 'von Schüler auswählen, in dem Lektion = Math, um durch Grade' SQL-Satz

Antwort

2

In Lucene, Sie Dokumente indizieren in Indizes, Dokumente Felder haben.

In Ihrem Fall hätten Sie ein Dokument mit 3 Feldern: Student, Lesson und Grade. Sie füllen dann einen Index mit diesen Dokumenten.

Kleines Beispiel:

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(); 

druckt:

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

--- 

Student: John; Lesson: Math; Grade:A 
Student: Julie; Lesson: Math; Grade:F