2012-03-25 3 views
0

다음 모델을 사용하여 인덱싱 쿼리에 대한 솔루션을 찾으려고합니다. 학생은 여러 개의 학습을하고 각 학습에는 등급이 하나 있습니다. 그러나 레슨 - 그레이드는 핵심 가치 쌍입니다.Lucene.net KeyValuePair 데이터 형식을 주문하고 쿼리하는 방법

내 첫 번째 질문은 :

어떻게 루씬의 색인 키 값해야 데이터? (그것 공간적 수있다? 좌표 등)

번째는

내가 루씬의 인덱스 데이터가 있다고 가정한다. 학생에게 질문 할 수있는 방법은 학과별로 수업 순서에 따라 정렬됩니다.

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

내가 비슷한 쿼리 뭔가 루씬에서 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 
관련 문제