Help us understand the problem. What is going on with this article?

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

More than 3 years have 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に興味を持ったなら、まずはインストールして試してみてください。

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

groonga
Groonga関連情報を提供します。Groongaだけでなく、RroongaやMroongaなどの情報も提供します。
http://groonga.org/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした