[英]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.