Lucene を使用して、次の構造を持つドメインをクエリしようとしています
Student 1-------* Attendance *---------1 Course
ドメイン内のデータを以下に要約します。
Course.name Attendance.mandatory Student.name
-------------------------------------------------
cooking N Bob
art Y Bob
クエリを実行すると、"courseName:cooking AND mandatory:Y"
Bob が返されます。これは、Bob が料理コースに参加しており、Bob も必修コースに参加しているためです。ただし、私が本当にクエリしたいのは、「必須の料理コースに参加している学生」であり、この場合、誰も返されません。
これを Lucene クエリとして定式化することは可能ですか? 実際には、Lucene を直接使用するのではなく、Compass を使用しているため、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
}