4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

groongaで--output_columnsの結果を任意の文字列でカスタマイズする方法

Last updated at Posted at 2013-04-04

いよいよ、gihyo.jpさんでgroongaの隔週更新連載が始まりました!! 初回は概要紹介の「第1回 全文検索エンジンgroongaを紹介します!」です。

連載は始まりましたが、利用事例をどんどん紹介していきたいので、groongaやmroongaを実際に使っていて、利用事例記事を書いてもいいよ、という人をまだまだ募集しています。
詳細はgroonga普及のための協力のお願いを参照してください。

はじめに

オープンソースのカラムストア機能付き全文検索エンジンgroongaを公開しています。
この記事を書いた時の最新のバージョンは2013年3月29日にリリースした3.0.2です。

今回は、groonga 3.0.2で対応した --output_columns での文字列連結について紹介します。

--output_columns での文字列連結

groonga 3.0.2では --output_columns での文字列連結を書くことができるようになりました。

例えば、特定カラムの内容の前後に<>を追加したい、といったときには+演算子を使って文字列を連結することができるようになりました。

--output_columns '"<" + カラム名 + ">"'

snippet_html()っぽいことができますね。
では実際にどんなふうに使えるか確認してみましょう。

サンプルのスキーマとデータ

サンプルのスキーマは以下の通りです。
Articleテーブルにtitle,category,contentカラムを作成しています。

table_create Article TABLE_PAT_KEY UInt32
column_create Article title COLUMN_SCALAR ShortText
column_create Article category COLUMN_SCALAR ShortText
column_create Article content COLUMN_SCALAR ShortText

table_create Lexicon TABLE_PAT_KEY ShortText --normalizer NormalizerAuto
column_create --table Lexicon --name title_index --flags COLUMN_INDEX|WITH_POSITION --type Article --source title
column_create --table Lexicon --name category_index --flags COLUMN_INDEX|WITH_POSITION --type Article --source category

サンプルのデータは以下の通りです。
これまでにQiitaへ投稿したタイトルですね。

load --table Article
[
{"_key":1, "category":"groonga", "title":"groongaでキーワードごとに重み付けをして検索するには"},
{"_key":2, "category":"mroonga", "title":"mroongaインストール時のMySQLとのバージョン不一致に対処する方法"},
{"_key":3, "category":"mroonga", "title":"mroongaでMySQL互換の照合順序を使うには"},
{"_key":4, "category":"groonga", "title":"groonga-httpdのセットアップでつまづかないための方法"},
{"_key":5, "category":"mroonga", "title":"mroongaで作ったテーブルをgroongaから検索するには"},
{"_key":6, "category":"groonga", "title":"groongaで特定のカラムを更新するには"},
{"_key":7, "category":"groonga", "title":"groongaでレコードを削除する方法"},
{"_key":8, "category":"groonga", "title":"groongaでMySQL互換のノーマライザーを使うには"},
{"_key":9, "category":"groonga", "title":"Groongaのデータベースをダンプ・リストアする方法"},
]

上記サンプルスキーマとデータの内容をsample.grnなどとして保存します。

次のコマンドを実行して、データベースを構築します。

% mkdir -p testdb
% groonga -n testdb/db < sample.grn

文字列連結による検索結果のカスタマイズ

ここまででデータベースの準備ができたので、実際に検索してみましょう。
まずはgroongaコマンドを実行して入力待機状態にします。

% groonga testdb/db

入力待機状態になったら以下のクエリを入力します。

select Article

以下のように9件の登録データが表示されます。

上のコマンドを実行した結果を見やすいように抜粋し、整形すると以下のようになります。
(なお、以降の実行結果も適宜抜粋・整形しており、実際の実行結果は他にも情報を含んでいます。詳しくは出力内容についてのドキュメントをご覧ください。)

[
  [9],
  [
    ["_id","UInt32"],["_key","UInt32"],["category","ShortText"],["content","ShortText"],["title","ShortText"]
  ],
  [1,1,"groonga","","groongaでキーワードごとに重み付けをして検索するには"],
  [2,2,"mroonga","","mroongaインストール時のMySQLとのバージョン不一致に対処する方法"],
  [3,3,"mroonga","","mroongaでMySQL互換の照合順序を使うには"],
  [4,4,"groonga","","groonga-httpdのセットアップでつまづかないための方法"],
  [5,5,"mroonga","","mroongaで作ったテーブルをgroongaから検索するには"],
  [6,6,"groonga","","groongaで特定のカラムを更新するには"],
  [7,7,"groonga","","groongaでレコードを削除する方法"],
  [8,8,"groonga","","groongaでMySQL互換のノーマライザーを使うには"],
  [9,9,"groonga","","Groongaのデータベースをダンプ・リストアする方法"]
]

では、実際に文字列連結を試してみましょう。

titleカラムをキーワードgroongaで検索して、その結果としてcategoryカラムを<div>タグのclassに指定して、<div>タグの内容はtitleカラムを指定することにしましょう。snippet_html()を使ってキーワードの周辺テキストの抽出もやってみましょう。

実際のクエリは以下のようになります。
このとき、--command_version 2を指定するのを忘れないでください。また、"を使うときはエスケープにも注意が必要です。

select Article --output_columns '"<div class=\\"" + category + "\\">" + title + "</div>", snippet_html(title)' --query "title:@groonga" --command_version 2

実行結果は以下のようになります。

[
  [
    [6],
    [
      ["","null"],["snippet_html","null"]
    ],
    ["<div class=\"groonga\">groongaでキーワードごとに重み付けをして検索するには</div>",["<span class=\"keyword\">groonga</span>でキーワードごとに重み付けをして検索するには"]],
    ["<div class=\"groonga\">groonga-httpdのセットアップでつまづかないための方法</div>",["<span class=\"keyword\">groonga</span>-httpdのセットアップでつまづかないための方法"]],
    ["<div class=\"groonga\">groongaで特定のカラムを更新するには</div>",["<span class=\"keyword\">groonga</span>で特定のカラムを更新するには"]],
    ["<div class=\"groonga\">groongaでレコードを削除する方法</div>",["<span class=\"keyword\">groonga</span>でレコードを削除する方法"]],
    ["<div class=\"groonga\">groongaでMySQL互換のノーマライザーを使うには</div>",["<span class=\"keyword\">groonga</span>でMySQL互換のノーマライザーを使うには"]],
    ["<div class=\"groonga\">Groongaのデータベースをダンプ・リストアする方法</div>",["<span class=\"keyword\">Groonga</span>のデータベースをダンプ・リストアする方法"]
  ]
]

これで、意図通りの結果が得られました。

--output_columnsで文字列連結を使うことで、記事のカテゴリごとに適用するスタイルを変更しつつ、(今回はタイトルだけでしたが)記事の内容に応じてsnippet_html()による検索キーワードのハイライトを行うということができるようになりました。

まとめ

今回は--output_columnsで文字列連結により結果をカスタマイズする方法を紹介しました。

groongaに興味を持ったなら、まずはインストールして試してみてください。

groongaの基本的な動作を知るためのチュートリアルもあります。インストールしたら試してみてください。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?