はじめに
- Groongaで学ぶ全文検索 2016-02-26に参加しました。
- 参加したといっても、本編の勉強会は間に合わず、参加者の発表タイムにやっと顔を出せた感じなので、この記事は以下の発表がベースとなっています。
GroongaでSelectした時の出力方法いろいろ
Selectについて
- Groongaは全文検索エンジンです。なのでSelectは最も重要な機能といえます。
- Groongaでは以下のような特徴的な出力方法を有しているので、その内容をいくつかピックアップして説明します。
- スニペット
- オフセット
- ソート
- 集計
- カウント
- 合計
- 平均
- 最大値
- 最小値
- クエリー展開
- カラムの重みづけ
- 重みの底上げ
スニペット(snippet_html)
- snippet_html関数の指定で、検索キーワード周辺の文字列を抽出されます。
- 抽出された文字列のうち、検索キーワードは以下のようなタグで囲まれます。
<span class="keyword">[検索キーワード]</span>
- スニペットはMroongaでやったことがあって、Mroongaの場合はmroonga_snippetという関数でやってました。
- 以下で少し触れています
MroongaとownCloudの良い関係 Groonga Meetup 2015
オフセット(offset)
- offsetを指定することで途中から結果を出せます。
- 勿論limitも指定可能です。
- 因みにlimitのデフォルトは10なので、純粋にselectすると10件しかレコードが抽出されないので、ご注意を。
- オフセットはページング処理に使われることが多いのです。
ソート(sortby)
- 勿論ソートできます。
- twitterとかでも使われている概念らしいのですが、一貫性のあるページングを実現する場合は、offsetに0を指定して、id等順序性のあるカラムでソートした上で、そのカラムで範囲検索するのが常套手段とのことです。
- で、Groongaはその範囲検索出来ることがスゴイんです。
集計
- おなじみの集計できます。
- 集計という括りにすると少し違いますがドリルダウンdrilldownは抑えておきたい機能のひとつです。
クエリー展開
- キーワード展開という呼び方でも良いみたいです。
- 画面入力に親和性の高い記載内容がクエリ言語で解析されます。
- つまり、入力からクエリに変換する実装をGroonga側でサポートしてくれることになります。
- 例えば、以下のようなパターンです。
- 「A B」と入力すると「A AND B」で検索される。
- 「A or B」と入力すると「A OR B」で検索される。
- 因みにANDとORをSQLでイメージすると、ANDはINTERSECTで、ORはUNIONとのことです。
カラムの重みづけ(match_columns)
- カラム毎に重み付けして、出力順変えることが出来ます。
- 検索結果を上位に出力する場合、この手の手段を使ってスコアを上げます。
- 例えば、Eコマースの商品テーブルで、タイトルカラムと商品説明カラムを「セール」という文字列で全文検索して、商品一覧表示する時に、タイトルに「セール」って文字が付いてる方が、お客さんの目を引くわけなので、タイトルカラムの重みを付けて、タイトルに「セール」という文字が入ってる商品のスコアを高くして、なるべく上に表示させることが出来ます。
重みの底上げ(filter)
- 重み付けはカラムに対してですが、重みの底上げはレコードに対してスコアを上げる仕掛けです。
- 例えば、先程のカラムの重み付けでセールが含まれるレコードの内、「春のセール」という文字列を含むレコードを上位に出力したい場合、このfilterを使って「春のセール」という文字列が入ってたらスコアを+10とかできるので、セール商品の中でも、春のセール商品を更に上に表示させるということ出来るのです。
さいごに
- selectはGroongaの根幹なので、今回の勉強会は良いネタだったと思われます!こんな便利なやり方があるのかと、勉強になりました。
- また、複数テーブルを跨いだ検索がスゴイとかMroongaはGroogaのエンジンに直結してるとか、目から鱗な情報が飛び交っており、この勉強会は開始から参加しなきゃいけないと再認識しました。
- 引き続き、ここで得た情報をアウトプットしていきたいですね。