2009-07-29 25 views
1
私は、クエリを実行すると、ドメイン内の

Luceneのクエリ構文

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

データが

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

以下に要約され、以下の構造を有するドメインを照会するためのLuceneを使用しようとしている

"courseName:cooking AND mandatory:Y"ボブは料理教室に参加しており、ボブも必須コースに参加しているので、ボブを返します。しかし、私は本当には、この場合は誰も返さない "必須の料理コースに参加している学生"です。

これをLuceneクエリとして作成することはできますか?実際にLuceneではなくCompassを直接使用しているので、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 
} 

答えて

-1

は、我々は非常に類似したクエリを使用して、これが私たちのために働く

+courseName:cooking +mandatory:Y 

をお試しください:

+ProdLineNum:1920b +HouseBrand:1 

をまた、これは(一般的な)自社ブランドで製品ライン1920b内のすべてを選択します。

+0

おかげで、それは動作しません - 私は "を省略した場合と同じ結果を得ます+記号 –

-1

クエリをテキスト文字列として作成し、それを解析してクエリオブジェクトを取得することができます。 Apache Lucene - Query Parser Syntaxを見たとしますか?

4

「スコープ検索」または「xml検索」と呼ばれることもあります。関連するサブ要素のセットに基づいて検索する機能です。 Luceneはこれをネイティブにサポートしていませんが、動作させるためにできることがいくつかあります。

学生に関連付けられたすべてのコースデータを1つのフィールドに入れることができます。次に、各コースの用語の間に固定された量(100のような)で用語の位置をバンプします。その後、フレーズクエリまたはスパンクエリを使用した近接検索を実行して、単一のコースの属性の一致を強制することができます。これは、Solrが複数の値を持つフィールドをサポートする方法です。

2

別の回避策はそれを

何かのような偽のゲッターとインデックスを追加することです:提案のための

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