Lucene的查询语法(Lucene Query Syntax)

2019-09-21 08:57发布

我试图使用Lucene来查询具有以下结构域

Student 1-------* Attendance *---------1 Course

域中的数据总结如下

Course.name   Attendance.mandatory   Student.name
-------------------------------------------------
cooking       N                      Bob
art           Y                      Bob

如果我执行查询"courseName:cooking AND mandatory:Y"返回鲍勃,因为鲍勃参加烹饪课程,和Bob也参加必修课程。 不过,我真的想查询是,在这种情况下将返回没人“参加强制性的烹饪课程的学生”。

是否有可能制订这是一个Lucene查询? 我实际使用罗盘,而不是直接的Lucene,所以我可以使用CompassQueryBuilder或Lucene的查询语言。

为了完整起见,域类本身如下所示。 这些类是Grails领域类,但我使用的是标准的指南针注释和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
}

Answer 1:

你所试图做的是有时被称为“内进行搜索”或“XML搜索” - 基于一组相关的子元素的搜索能力。 Lucene的本身并不支持这一点,但也有一些技巧,你可以做的就是它的工作。

你可以把所有的单场学生相关课程的数据。 然后凸块固定量(如100),用于每个疗程的术语之间的术语的位置。 然后,你可以做一个近似搜索与短语查询或查询范围,迫使比赛为一门课程的属性。 这是Solr的如何支持多值的字段。



Answer 2:

另一个解决办法是添加虚假getter和指数就

就像是:

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


Answer 3:

尝试

+courseName:cooking +mandatory:Y

我们使用非常相似的查询,这为我们工作:

+ProdLineNum:1920b +HouseBrand:1

这将选择在产品线感器1920b的一切,也是一个自有品牌(通用)。



Answer 4:

你可以创建查询文本字符串,然后解析,让您的查询对象。 相信你已经看到的Apache Lucene的-查询语法分析 ?



文章来源: Lucene Query Syntax