6

私のGrailsアプリは、検索機能を提供するためにCompassとLuceneに基づいて構築された検索可能なプラグインを使用しています。著者と本という2つの検索可能なクラスがあります。これらのクラスを検索インデックスにマップしたので、特定のフィールドのみを検索できます。

両方のクラスで検索を実行するには、単に呼び出します

def results = searchableService.search(query)

両方のクラスを同時に検索することの優れた機能の1つは、results含まれる結果の数、使用可能な結果の数、ページネーションの詳細などに関するメタデータがオブジェクトに含まれることです。

最近、Bookクラスにブールapprovedフラグを追加しましたが、未承認の本を検索結果に表示したくありません。1つのオプションは、上記の呼び出しを次のように置き換えることです。

def bookResults = Book.search(query + " approved:1")
def authorResults = Author.search(query)

ただし、ここで、両方の結果のメタデータを組み合わせる方法を理解する必要があります。これは、注意が必要な場合があります(特にページネーション)。

単一のクエリで本と著者を検索する方法はありますが、承認された本のみを返しますか?

4

2 に答える 2

6

著者を検索できるようにしたいですか、それとも特定の著者の本を検索したいですか?

特定の著者の書籍を検索する場合は、次の方法でドメイン クラスを構成できます。

class Author {
    String name
    ...

    static searchable = {
        root false
    }    
}

これにより、結果から作成者が除外され、インデックスsearchableService.search(query)のようなフィールド名が見つかります。$/Book/Author/name(luke を使用してインデックスを調べます: http://code.google.com/p/luke/ )。

prefixBook クラスでより良い設定を行うことで、これらのフィールドの名前を変更できます。

class Book {
    String name
    Author author
    ...

    static searchable = {
        author component: [prefix: 'author']
    }    
}

これにより、インデックス内のフィールドの名前が に変更されbookauthorます。

で検索するとsearchableService.search(query)、本の名前または著者の名前に検索用語が含まれるすべての本が見つかります。authorname:xyz構文を使用して、特定の著者に検索を制限することもできます。


あなたが本当に検索結果をミックスしたいのであれば、私はあなたがすでに述べた解決策しか知りません: 両方の結果をあなた自身のコードとミックスしますが、ヒットのスコアリングを良い方法でミックスするのは難しいと思います.

あなたの応答を更新してください:これが私のページネーションコードです...

.gsp:

<div class="pagination">
  <g:paginate total="${resultsTotal}" params="[q: params.q]"/>
</div>

コントローラ:

result = searchableService.search(params.q, params)
[
  resultList: result.results, 
  resultsTotal: result.total
]

したがって、2 つの検索結果をマージしてresult.totals を追加するだけで、うまくいく可能性があります。

于 2012-01-12T21:00:12.320 に答える
4

テストアプリを作成し、次の解決策にたどり着きました。多分それは助けます...

プロパティの状態がとapprovedのみの​​場合、次のクエリが機能します。01

def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} -approved:0 -approved:1)"
)

QueryParser ではなく BooleanQueryBuilder を使用する場合、これはより良い方法で再定式化できると思います。

ところで:次のようなメソッドを追加すると

String getType() { "Book" }

String getType() { "Author" }

ドメインに対して、このように検索を構成することもできます

def results = searchableService.search(
    "(${query} AND approved:1) OR (${query} AND type:Author)"
)
于 2012-01-19T22:05:36.190 に答える