Lucene.net как заказать и запросить тип данных KeyValuePair - PullRequest
0 голосов
/ 25 марта 2012

Я пытаюсь найти решение об индексировании-запросах по следующей модели: У ученика есть много уроков, и для каждого урока есть один класс. Однако урок - это пара ключ-значение.

мой первый вопрос:

как мне индексировать в lucene эти значения ключа? (это как координата может быть пространственной?)

второй -

Предположим, у меня есть индексированные данные в lucene. Как я могу запросить студентов, по Название урока, но по классу.

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

Могу ли я создать запрос, похожий на 'выберите ученика, где Урок = математический порядок по классу', фраза sql

1 Ответ

2 голосов
/ 25 марта 2012

В 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
...