Я пытаюсь использовать Lucene для запроса домена, который имеет следующую структуру
Student 1-------* Attendance *---------1 Course
Данные в домене приведены ниже
Course.name Attendance.mandatory Student.name
-------------------------------------------------
cooking N Bob
art Y Bob
Если я выполняю запрос "courseName:cooking AND mandatory:Y"
, он возвращает Боба, потому что Боб посещает курс кулинарии, а Боб также посещает обязательный курс. Однако то, что я действительно хочу запросить, - это "студенты, посещающие обязательный курс кулинарии", которое в этом случае никому не вернет.
Можно ли сформулировать это как запрос Lucene? На самом деле я использую Compass, а не Lucene напрямую, поэтому я могу использовать CompassQueryBuilder или язык запросов Lucene.
Ради полноты сами доменные классы показаны ниже. Эти классы являются классами домена Grails, но я использую стандартные аннотации Compass и синтаксис запросов Lucene.
@Searchable
class Student {
@SearchableProperty(accessor = 'property')
String name
static hasMany = [attendances: Attendance]
@SearchableId(accessor = 'property')
Long id
@SearchableComponent
Set<Attendance> getAttendances() {
return attendances
}
}
@Searchable(root = false)
class Attendance {
static belongsTo = [student: Student, course: Course]
@SearchableProperty(accessor = 'property')
String mandatory = "Y"
@SearchableId(accessor = 'property')
Long id
@SearchableComponent
Course getCourse() {
return course
}
}
@Searchable(root = false)
class Course {
@SearchableProperty(accessor = 'property', name = "courseName")
String name
@SearchableId(accessor = 'property')
Long id
}