2009-07-29 80 views
1

我試圖使用Lucene來查詢具有以下結構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 
} 

回答

-1

嘗試

+courseName:cooking +mandatory:Y 

我們用非常類似的查詢,這爲我們工作:

+ProdLineNum:1920b +HouseBrand:1 

這將選擇在產品線感器1920b的一切,也是一個自有品牌(通用)。

+0

感謝您的建議,但它不工作 - 我得到了相同的結果時,我省略了「 +「的標誌 – 2009-07-29 19:50:12

4

你試圖做的事有時被稱爲「範圍搜索」或「xml搜索」 - 基於一組相關子元素進行搜索的能力。 Lucene本身不支持這個,但是你可以通過一些技巧來實現它。

您可以將與學生關聯的所有課程數據放在單個字段中。然後在每個課程的術語之間固定一個固定的數量(如100)。然後,您可以使用短語查詢或跨度查詢執行鄰近搜索,以強制匹配單個課程的屬性。這就是Solr如何支持多值字段。

2

另一個解決辦法是添加虛假getter和指數就

喜歡的東西:

@SearchableComponent 
Course getCourseMandatory() { 
    return course + mandatory; 
}