Lucene查询语法

Lucene查询语法,lucene,compass-lucene,Lucene,Compass Lucene,我正在尝试使用Lucene查询具有以下结构的域 Student 1-------* Attendance *---------1 Course 该领域的数据汇总如下 Course.name Attendance.mandatory Student.name ------------------------------------------------- cooking N Bob art Y

我正在尝试使用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,所以我可以使用Compass或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
}
@可搜索
班级学生{
@SearchableProperty(访问者='property')
字符串名
静态hasMany=[出席人数:出席人数]
@SearchableId(访问者='property')
长id
@可搜索组件
设置出席人数(){
回访人次
}
}
@可搜索(root=false)
课堂出勤率{
静态belongsTo=[学生:学生,课程:课程]
@SearchableProperty(访问者='property')
字符串必填=“Y”
@SearchableId(访问者='property')
长id
@可搜索组件
Course getCourse(){
回程
}
}
@可搜索(root=false)
班级课程{
@SearchableProperty(访问者='property',name=“courseName”)
字符串名
@SearchableId(访问者='property')
长id
}
试试看

我们使用了非常相似的查询,这对我们很有用:

+ProdLineNum:1920b +HouseBrand:1
这将选择产品线1920b中的所有产品,这些产品线也是一个自有品牌(通用)。

试试看

我们使用了非常相似的查询,这对我们很有用:

+ProdLineNum:1920b +HouseBrand:1

这将选择产品线1920b中的所有产品,它们也是一个自有品牌(通用)。

您只需将查询创建为文本字符串,然后对其进行解析即可获得查询对象。假设您已经看到了?

您可以将查询创建为文本字符串,然后对其进行解析以获得查询对象。假设您已经看到了?

您尝试执行的操作有时被称为“范围搜索”或“xml搜索”——基于一组相关子元素进行搜索的能力。Lucene本机不支持此功能,但您可以使用一些技巧使其正常工作


您可以将与学生关联的所有课程数据放在一个字段中。然后,在每门课程的术语之间,将术语位置增加一个固定的数量(如100)。然后,您可以使用短语查询或跨度查询进行近似搜索,以强制匹配单个课程的属性。这就是Solr支持多值字段的方式。

您尝试执行的操作有时被称为“范围搜索”或“xml搜索”——基于一组相关子元素进行搜索的能力。Lucene本机不支持此功能,但您可以使用一些技巧使其正常工作


您可以将与学生关联的所有课程数据放在一个字段中。然后,在每门课程的术语之间,将术语位置增加一个固定的数量(如100)。然后,您可以使用短语查询或跨度查询进行近似搜索,以强制匹配单个课程的属性。这就是Solr支持多值字段的方式。

另一个解决方法是添加假getter并为其编制索引

比如:

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

另一个解决方法是添加假getter并为其编制索引

比如:

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

谢谢你的建议,但它不起作用-我得到的结果与我省略“+”符号时的结果相同感谢你的建议,但它不起作用-我得到的结果与我省略“+”符号时的结果相同