[groonga-dev,03822] Re: rroonga / 複数キーワードによる検索

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 12月 30日 (水) 23:34:23 JST


須藤です。

In <A1873****@mva*****>
  "[groonga-dev,03821] Re: rroonga / 複数キーワードによる検索" on Wed, 30 Dec 2015 13:22:17 +0900,
  Masatoshi SEKI <m_seki****@mva*****> wrote:

>> records = documents.select do |record|
>>  conditions = []
>>  begin
>>    conditions << record.content.match(query, :allow_column => false)
>>  rescue Groonga::SyntaxError
>>    p $!
>>  end
>>  conditions
>> end
> 
> おー。かっこいい!!

よかったです!

> snippetで使うキーワードはcondtionsから取り出せますか?

conditionsからはとれませんが、違う方法でとれます。

recordsから検索に使った検索式オブジェクトが取り出せるのです
が、そいつからsnippetオブジェクトを作れます。そいつには
conditionsに入っているキーワードが設定されています。

  snippet = records.expression.snippet([["<span class=\"keyword\">", "</span>"]])

とすると、このsnippetが作るスニペットではキーワードが

  <span class="keyword">keyword</span>

となります。たぶん、HTML出力で使う場合は次のよう
に:html_escape => trueを指定します。こうすれば、キーワードや
他の文のところにある<などをエスケープしてくれるのでHTML出力
に便利です。

  snippet = records.expression.snippet([["<span class=\"keyword\">", "</span>"]])

snippetオブジェクトでスニペットを作るには

  snippet.execute(text)

とします。配列が返ってきて、それぞれがスニペットになっていま
す。

まとめるとこんな感じです。

  snippet = records.expression.snippet([["<span class=\"keyword\">", "</span>"]],
                                       :html_escape => true)
  records.each do |record|
    puts(record.key)
    puts(snippet.execute(record.description))
  end


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
リーダブルコードワークショップ:
  http://www.clear-code.com/services/code-reader/readable-code-workshop.html




groonga-dev メーリングリストの案内
Back to archive index