以前に
ここ
で、検索結果とページ全体の総件数の両方とる方法を記載した
そこで検索表示したあとに、paginateタグを使ってページ処理するときに同様の検索条件で次ページや前ページを検索するときは、
1 2 3 |
<g:paginate total="${bookCount}" params="${params}"/> |
のように、paramsを全てリクエストパラメタにのけると便利。
いかがでしたでしょうか
Grails に関する情報
以前に
ここ
で、検索結果とページ全体の総件数の両方とる方法を記載した
そこで検索表示したあとに、paginateタグを使ってページ処理するときに同様の検索条件で次ページや前ページを検索するときは、
1 2 3 |
<g:paginate total="${bookCount}" params="${params}"/> |
のように、paramsを全てリクエストパラメタにのけると便利。
elasticsearch-grails-plugin については、
elasticsearch grails plugin を入れる
elasticsearch grails plugin 詳細設定
elasticsearch grails plugin index編
で紹介した。
今回は、search編。
注意!
日付での検索は注意が必要なので、日付を使う検索は一番したの記述をみてください。
search() で、中に検索条件を書く
1 2 3 |
def result = BlogPostElastic.search("postDate : " + date) |
結果は以下のようになる。
result.searchResults : 検索結果
result.total : 検索のトータル
一回の検索で、全件は取れない。全件とるには total の数になるか、searchResults がなくなるまで検索する。
その時は、 以下のように、from を使うとよい。
1 2 3 |
BlogPostElastic.search("postDate : " + date, [from :allResult.size() ]) |
QueryString の文法は
http://lucene.apache.org/core/3_0_3/queryparsersyntax.html にある。
例えば、AND でつなげたい場合は、
1 2 3 4 5 6 |
def result = BlogPostElastic.search("postDate : " + date + " AND post : "+ post + " AND writer : "+ person ) |
こちらは、Elasticsearch での検索と同じような感覚で使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def searchResult = BlogPostElastic.search() { bool {[ must { term(postDate: date) }, must { term(post: post) }, must { term(writer: person) }] } } |
内部で if文も使える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def searchResult = BlogPostElastic.search() { bool { if(dateStart) { must { range { postDate(from: new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'").format(dateStart)) } } } if(dateEnd) { must { range { postDate(from: new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'").format(dateEnd)) } } } } } |
search は日付の検索に注意。
Config.groovy で、
1 2 3 |
elasticSearch.date.formats |
で、日付のフォーマット変更できるみたいだけど、将来変わる可能性ありとの事なので、標準のまま利用する。
標準だと、以下のような形式で入っているので、検索するときはこの形式にする
1 2 3 |
yyyy-MM-ddTHH:mm:ss |
SimpleDateFormat を使うとこんな感じ
1 2 3 |
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'").format(new Date) |
ただし、検索のときにロケール/Timezone を意識してね。