2011-06-17 5 views
0

私のウェブサイトでは、入力フィールドのいくつかが国、都市、年月日の有無にかかわらず、キーワードなどで検索する必要があります。Grailsの検索メカニズム

私の問題は、ユーザーが検索したいものを決める必要があるということです。たとえば、彼らがちょうど日付、または日付と都市、または都市とキーワード..などを導入したい場合は、私は実際にそれを行う方法を知っていない、私は、一度に1つの事を検索する方法を知っているこのオールインワンをどうやってやればいいのか分かりません。

)このようなものが必要ですか(if-else、if-else)、各組み合わせのコードを書くよりも簡単な方法がありますか?

b)にBytheway、私の検索機構はfolowing方法(i'vは前に検索メカニズムをやったことがないので、私はそれが最善のaproachであれば、またここにいくつかのコメントをapreciateや提案だろう知らない)行われます

私のコントローラでは、私はstatmentのための二重演算を行い、検索のために導入された単語とallAttributesTogether()の結果とのクロスマッチングを行います。

ありがとうございました。

答えて

0

フィルタペイントのプラグインを確認してください。

0

あなたが "検索"と言うとき、私の心の検索エンジンに来る。しかし、私はあなたがデータベースを照会することを求めていると思いますよね?

検索の仕組みについて言えば、検索エンジンは素晴らしいツールです。 Lucene、Compass、ElasticSearch(ES)を見てみましょう。コンパスとESはluceneに基づいていますが、抽象度が高い(使いやすい)抽象度が高いです。 私はElasticSearchを非常に満足して使用しています。

データベースのクエリについては、動的にHQLクエリを作成することができます。このメソッドは、params属性を使用するため、コントローラ内に存在する必要があります。それは大丈夫ですか?

List allAttributesTogether() { 
    def query = " select book from Book book " 
    def queryParams = [:] 
    def needsAnd = false 

    if(params.a || params.b || params.z){ 
     query += " where " 
    } 
    if(params.a){ 
     query += " book.a = :a " 
     queryParams['a'] = params.a 
     needsAnd = true 
    } 
    if(params.b){ 
     if(needsAnd) query += " and " 
     query += " book.b = :b " 
     queryParams['b'] = params.b 
     needsAnd = true 
    } 
    if(params.a){ 
     if(needsAnd) query += " and " 
     query += " book.z = :z " 
     queryParams['z'] = params.z 
    } 

    return Book.executeQuery(query, queryParams) 

} 

Criteria builderの代わりに使用することもできます。また、if節を使用してCriteria節に節を追加することもできます。

+0

複数のドメインにまたがるエントリを検索する場合はどうすればよいですか? – gotomanners

+0

同じ解決策です。複数のドメインでHQLを使用することができます。また、「新しいマップを選択」構文を使用して、結果としてマップを生成することもできます。この構文は、複数のドメインにまたがってクエリを実行するReportsクエリに多く使用され、一部のフィールドのみを結果として使用します。 http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql .html#queryhql-select – felipenasc

+0

ありがとう、私はその '新しい地図を選択する' – gotomanners

関連する問題