Edited at

Groongaで学ぶ全文検索 2016-02-26

More than 3 years have passed since last update.

Groongaで学ぶ全文検索 2016-02-26に参加しました。4回目の参加です。

先日ドキュメントを読んでいたら、「select」はとても重要なコマンドだと書いてあったのでselectについて知りたいと思いました。ということで今回は 「selectでできること」 を教えていただきました。


なんでselectコマンドが重要なのか

Groongaの「コマンド」はRDBMSでいう「SQL」にあたります。

テーブルを作成する「table_create」、データを読み込む「load」、データを検索する「select」などがあります。

Groongaは全文検索エンジンなので欲しい情報を取得できることが大事です。だから「select」コマンドが大事なのです。seletを使いこなすことはGroongaを使いこなすことにつながるんだと思います。


selectでできること

selectでできることはこんな感じです。


  • 全文検索(絞り込み)

  • 完全一致検索

  • ソート

  • 途中から結果を出せる(オフセット)

  • 検索結果を特定のキーワードでハイライトさせたりできる(snipet_html)

  • カラムでグルーピングしてレコード一覧出力できる

  • クエリー言語として解析できる

  • 集計できる


    • カウント

    • 合計

    • 平均

    • 最大値

    • 最小値



  • クエリー展開できる

  • カラムの重みづけができる

  • 重みの底上げができる

太字部分に関してピンとこなかったので説明して頂きました。以下に書いていきます。

検索結果を特定のキーワードでハイライトさせたりできる(snippet_html

Groongaにはsnippet_htmlという関数があります。引数にキーワードを指定すると

<span class="keyword">キーワード</span>という形式で返してくれます。アプリケーションでcssを指定することでハイライトさせる等の見せ方が可能です。snippet_htmlではタグの指定はできませんが、通常はこれで十分です。タグを指定できるプロ仕様の関数もあるそうです。

クエリー言語として解析できる

例えばGoogleの検索欄に「A B」と入力すると「A AND B」の条件に一致する検索結果が返されます。「A AND B」と入力した場合も同じです。また、「A OR B」と入力するとAかBいずれか一方でも含まれれば検索結果に出力されます。こんなことがGroongaでもできます。

・「A AND B」と入力 → AとBを含むデータが出力される

・「A OR B」と入力 → AかBどちらか一方でも含まれれば検索結果として出力される
・「(A OR B)- C」と入力 → AかBが含まれるデータのうち、Cが含まれないものが検索結果として出力される
・「[カラム名]:[キーワード]」→ カラムを指定して完全一致検索される
・「[カラム名]:@[キーワード]」→ カラムを指定して全文検索される

ユーザーが検索条件を柔軟に指定することができるので、アプリケーション側で様々な条件に対応した検索のためのインターフェースを用意していなくても、入力内容によって柔軟な検索が可能になります。

クエリー展開

焼き肉のお店を探していて、検索キーワードに「焼き肉」と入力したとき、「焼き肉」、「焼肉」、「やきにく」全部ヒットして欲しい場合があるとします。そのときユーザーが「焼き肉 OR 焼肉 OR やきにく」と入力すればOKですが、入力するのは大変です。そこでGroongaでは、「焼き肉」と入力されると「焼き肉 OR 焼肉 OR やきにく」と自動的に展開するしくみを用意できるようになっています。展開するキーワードとして適切なものはアプリケーションに依存するので、アプリケーション作成者が任意で指定する必要があります。

重みの底上げ

カラムの重み付けを利用して検索することで重みが決まりますが、そのあと調整することもできるそうです。

例えばキャンペーンカラムというものがあって、「”春のキャンペーン”が入っていたらそのレコードの重みに+10する」などの指定が可能です。

重み付けはカラムに対してですが、重みの底上げはレコードに対して行うものです。

  


まとめ


  • selectでできることがわかりました。試してみたくなりました。

  • selectでできることを利用したい場面に直面したとき、適切なものを選択できる気がします。


  • snippet_htmlを使って実装した例を@KitaitiMakotoさんが見せてくださったのでイメージがわいてすごくわかりやすかったです!

  • 会中、隠しきれないほど絶え間なくお腹がなってしまいました。。次回からはお菓子食べてから行きます(>_<)