groonga

groongaでキーワードごとに重み付けをして検索するには

More than 1 year has passed since last update.


はじめに

2013年1月29日にオープンソースのカラムストア機能付き全文検索エンジンgroonga 2.1.2をリリースしました。

そこで2.1.2で新規に追加された複数のquery()関数のサポートを使って、キーワードごとに重み付けをして検索する方法を紹介します。


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

例で使うテーブルのスキーマは以下の通りです。

table_create Users TABLE_NO_KEY

column_create Users name COLUMN_SCALAR ShortText
column_create Users memo COLUMN_SCALAR ShortText

table_create Lexicon TABLE_HASH_KEY ShortText \
--default_tokenizer TokenBigramSplitSymbolAlphaDigit \
--normalizer NormalizerAuto
column_create Lexicon users_name COLUMN_INDEX|WITH_POSITION Users name
column_create Lexicon users_memo COLUMN_INDEX|WITH_POSITION Users memo

例で使うテーブルのデータは以下の通りです。

Usersテーブルのnameカラムとmemoカラムにデータを登録します。

 load --table Users

[
{"name": "Alice", "memo": "groonga user"},
{"name": "Alisa", "memo": "mroonga user"},
{"name": "Bob", "memo": "rroonga user"},
{"name": "Tom", "memo": "nroonga user"},
{"name": "Tobby", "memo": "groonga and mroonga user. mroonga is ..."},
]

まずは、Usersテーブルのnameカラムからキーワード"alice"を全文検索するクエリの例を示します。(nameカラムで合致したデータに対する重みづけとして10をこのサンプルでは指定します)

query()関数を使ったクエリは以下のように書くことができます。

select Users \

--output_columns name,_score \
--filter 'query("name * 10", "alice")'

Usersテーブルからnameカラムに10の重み付け"name * 10"を行い、キーワード"alice"を全文検索します。

結果としてマッチしたnameカラムの値と、マッチした場合のスコア(_score)を表示します。

条件にマッチするほど_scoreの値は大きくなります。

ではいくつかキーワードが与えられていて、そのキーワードに異なる重みづけをして全文検索を行いたいときにはどうなるでしょうか。

query()関数を使って、以下のようにキーワードごとに重み付けをしてmemoカラムを検索してみます。

groongaもしくはmroongaを使っているuserで、mroongaを最も重視する、という例です。

全文検索対象のキーワード
キーワードに対する重み付けの値

groonga
10

mroonga
20

user
1

実際のクエリは以下のように書くことができます。

select Users \

--output_columns name,memo,_score \
--filter 'query("memo * 10", "groonga") || query("memo * 20", "mroonga") || query("memo * 1", "user")' \
--sortby -_score

クエリの結果では重みづけを行っているのでmroongaがより上位に来ていることがわかります。

[

["name","ShortText"],["memo","ShortText"],["_score","Int32"]
],
["Tobby","groonga and mroonga user. mroonga is ...",51],
["Alisa","mroonga user",21],
["Alice","groonga user",11],
["Tom","nroonga user",1],
["Bob","rroonga user",1]

このようにquery()関数を使うことで、キーワードの重要度に応じて検索結果を得られるようになりました。


まとめ

groonga 2.1.2で追加されたquery()関数を使って、キーワードごとに重み付けを行って検索する例を紹介しました。

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

チュートリアルも用意しています。