Lucene Query Syntax - PullRequest
       16

Lucene Query Syntax

1 голос
/ 29 июля 2009

Я пытаюсь использовать 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
}

Ответы [ 4 ]

4 голосов
/ 30 июля 2009

То, что вы пытаетесь сделать, иногда называют «поиском по области» или «поиском по XML» - это возможность поиска на основе набора связанных подэлементов. Lucene изначально не поддерживает это, но есть некоторые приемы, которые можно сделать, чтобы заставить его работать.

Вы можете поместить все данные курса, связанные со студентом, в одно поле. Затем увеличьте размер позиции на фиксированную сумму (например, 100) между терминами для каждого курса. Затем вы можете выполнить поиск по близости с запросами фраз или интервалов, чтобы принудительно установить соответствие для атрибутов одного курса. Вот как Solr поддерживает многозначные поля.

2 голосов
/ 23 ноября 2009

Другой обходной путь - добавить поддельный геттер и проиндексировать его

Что-то вроде:

@SearchableComponent
Course getCourseMandatory() {
    return course + mandatory;
}
0 голосов
/ 29 июля 2009

Вы можете просто создавать запросы в виде текстовой строки, а затем анализировать их, чтобы получить объект запроса. Предположим, вы видели Apache Lucene - синтаксический анализатор запросов ?

0 голосов
/ 29 июля 2009

Попробуйте

+courseName:cooking +mandatory:Y

Мы используем довольно похожие запросы, и это работает для нас:

+ProdLineNum:1920b +HouseBrand:1

Это выбирает все в линейке продуктов 1920b, которая также является фирменным брендом (универсальным).

...