Groongaのbetween()関数の改善点

  • 1
    いいね
  • 0
    コメント

Groonga Advent Calendar 2016 14日目は、Groonga 6.1.1でのbetween()関数の改善点を取り上げます。

between()とは?

between()関数はその名の通り、値の範囲を示します。selectコマンドの--filterオプションで指定する検索条件に記述すると、第1引数に指定されたカラムの値が第2引数以降で指定された範囲内に収まっているレコードだけを取り出すことができます。

Groonga 6.1.0までのバージョンではbetween()の第1引数には_key以外の任意のカラムを指定する必要があり、_keyに対する範囲指定での検索はできない仕様でした。Groonga 6.1.1ではこの点が改善され、_keyが整数または日時のテーブルであれば、_keyも対象のカラムに指定できるようになりました。

準備

実際の動作を見てみましょう。実験用のテーブルとして、主キーが時刻であるテーブル(ここでは例として、Webページの閲覧履歴を想定したテーブルにしてみました)を用意します。

$ cat dump.grn
table_create History TABLE_PAT_KEY Time
column_create History url COLUMN_SCALAR ShortText
column_create History title COLUMN_SCALAR ShortText
table_create Terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
load --table History
[
["_key","url","title"],
[1481799732,"http://example.org/","This is test record 1!"],
[1481799755,"http://example.net/","test record 2."],
[1481799811,"http://example.com/","test test record three."],
[1481799915,"http://example.net/afr","test record four."],
[1481800003,"http://example.org/aba","test test test record five."],
[1481800013,"http://example.com/rab","test test test test record six."],
[1481800204,"http://example.net/atv","test test test record seven."],
[1481801705,"http://example.org/gat","test test record eight."],
[1481803448,"http://example.com/vdw","test test record nine."]
]
column_create Terms history_title COLUMN_INDEX|WITH_POSITION History title
column_create Terms history_url COLUMN_INDEX|WITH_POSITION History url
$ rm -rf /tmp/groonga-databases
$ mkdir -p /tmp/groonga-databases
$ groonga -n /tmp/groonga-databases/introduction.db quit
$ cat dump.grn | groonga /tmp/groonga-databases/introduction.db

実際の動作

それでは早速試してみましょう。--filterbetween(_key, 1481799800, "include", 1481800000, "include")という検索条件を指定して検索してみます。

$ groonga groonga-databases/introduction.db \
    select --table History \
           --filter '"between\(_key, 1481799800, \"include\", 1481800000, \"include\"\)"' |
    jq .
[
  [
    0,
    1481800116.779398,
    0.001013755798339844
  ],
  [
    [
      [
        2
      ],
      [
        [
          "_id",
          "UInt32"
        ],
        [
          "_key",
          "Time"
        ],
        [
          "title",Groonga 6.1.1での`between()`関数の改善点
          "ShortText"
        ],
        [
          "url",
          "ShortText"
        ]
      ],
      [
        3,
        1481799811,
        "test test record three.",
        "http://example.com/"
      ],
      [
        4,
        1481799915,
        "test record four.",
        "http://example.net/afr"
      ]
    ]
  ]
]

無事、主キーの時刻が指定の範囲内に収まっているレコードだけが検索されました。もちろん他の検索条件との併用も可能です。

以上、Groonga Advent Calendar 2016 14日目としてGroonga 6.1.1でのbetween()関数の改善点ついて述べました。引き続きGroonga Advent Calendarをお楽しみ下さい!