簡體   English   中英

Lucene查詢語法

[英]Lucene Query Syntax

我正在嘗試使用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查詢? 我實際上是在使用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
}

您嘗試做的有時被稱為“范圍搜索”或“xml搜索” - 基於一組相關子元素進行搜索的能力。 Lucene本身並不支持這種做法,但是你可以采取一些技巧來實現它。

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

另一個解決方法是添加假getter並將其編入索引

就像是:

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

嘗試

+courseName:cooking +mandatory:Y

我們使用非常相似的查詢,這對我們有用:

+ProdLineNum:1920b +HouseBrand:1

這選擇了產品系列1920b中的所有產品系列(通用)。

您可以只創建查詢作為文本字符串,然后解析它以獲取您的查詢對象。 假設您已經看過Apache Lucene - Query Parser Syntax

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM