[groonga-dev,02777] Re: _keyを後から変更したい

Zurück zum Archiv-Index

Kouhei Sutou kou****@clear*****
2014年 9月 17日 (水) 22:14:28 JST


須藤です。

In <20140****@jcom*****>
  "[groonga-dev,02775] _keyを後から変更したい" on Wed, 17 Sep 2014 12:19:03 +0900,
  shinonon <shino****@jcom*****> wrote:

> 今まで HyperEstraier で構築していた自作のシステムを Groonga にしてみよう
> と思って検討しています。そこで、Groonga で登録済みのカラムの _key を後か
> ら変更したいのですが、私が試した中ではできなさそうです。何かいい方法はあ
> りませんでしょうか?

あぁ、_keyを変更する機能は機能としてはあるのですが、外からは
呼ぶ方法はないですね。。。

> _key を変更する方法を私が知らないだけでしたら杞憂ですが、仮に変更する方
> 法がなかった場合、Groonga の機能の活用(例えばテーブル作成の工夫や検索条
> 件の工夫やドリルダウン機能等)や使い方の工夫で、もしかしたらいい解決方法
> があるのかもしれませんが、私が調べた中ではいい方法が思いつきません。長文
> になって申し訳りませんが、以下にやりたいことを記しますので、どなたかアド
> バイスがありましたら教えていただけますでしょうか?

Milkodeを作っているongaeshiさんがノウハウを持っていそうな気
がします。

この記事が参考になるかもしれません。
  http://gihyo.jp/dev/clip/01/groonga/0004

> あるフォルダ構造を持ったデータを扱おうと思っています。
>   1. /FolderA/article0
>   2. /FolderA/FolderB/article1
>   3. /FolderC/article2
> 
> フォルダ構造+ファイル名を _key として、内容を body として持ち、_key も 
> body もインデックス型のカラムとします。全文検索は body を query して行い、
> 通常は filter なし、特定のフォルダ内を検索したいときだけ filter で _key 
> の前方一致を条件にしようと思っています。

パスをキーではなくpathカラムに入れるのはどうでしょうか?

それぞれのファイルのキーはUUIDやハッシュ値など一意な値にして
こんな感じでどうでしょうか。(↓では単純に1ずつインクリメン
トしています。)

table_create Files TABLE_HASH_KEY UInt64
column_create Files path COLUMN_SCALAR ShortText
column_create Files body COLUMN_SCALAR LongText

table_create Paths TABLE_PAT_KEY ShortText
column_create Paths files_path COLUMN_INDEX Files path

table_create Tokens TABLE_PAT_KEY ShortText \
  --default_tokenizer TokenBigram \
  --normalizer NormalizerAuto
column_create Tokens files_body COLUMN_INDEX|WITH_POSITION Files body

TABLE_PAT_KEYでインデックスを張っている(Paths.file_path)の
でインデックスを使った前方一致検索もできます。

load --table Files
[
{"_key": 1, "path": "/FolderA/article0", "body": "0番目の記事です。"},
{"_key": 2, "path": "/FolderA/FolderB/article1", "body": "Bの0番目の記事です。"},
{"_key": 3, "path": "/FolderC/article2", "body": "Cの2番目の記事です。"}
]

select Files --filter 'path @^ "/FolderA/" && query("body", "B 記事")' --commanbd_version 2
# [
#   [
#     0,
#     1410959391.35675,
#     0.000402927398681641
#   ],
#   [
#     [
#       [
#         2
#       ],
#       [
#         [
#           "_id",
#           "UInt32"
#         ],
#         [
#           "_key",
#           "UInt64"
#         ],
#         [
#           "body",
#           "LongText"
#         ],
#         [
#           "path",
#           "ShortText"
#         ]
#       ],
#       [
#         1,
#         1,
#         "0番目の記事です。",
#         "/FolderA/article0"
#       ],
#       [
#         2,
#         2,
#         "Bの0番目の記事です。",
#         "/FolderA/FolderB/article1"
#       ]
#     ]
#   ]
# ]

もちろん、全文検索と組み合わせることもできます。

select Files --match_columns body --query "B 記事" --filter 'path @^ "/FolderA/"'
# [
#   [
#     0,
#     1410959391.35717,
#     0.000516176223754883
#   ],
#   [
#     [
#       [
#         1
#       ],
#       [
#         [
#           "_id",
#           "UInt32"
#         ],
#         [
#           "_key",
#           "UInt64"
#         ],
#         [
#           "body",
#           "LongText"
#         ],
#         [
#           "path",
#           "ShortText"
#         ]
#       ],
#       [
#         2,
#         2,
#         "Bの0番目の記事です。",
#         "/FolderA/FolderB/article1"
#       ]
#     ]
#   ]
# ]

> そのような中で、仮に FolderA の名前が変更された場合 1,2 の _key を変更し
> ようと思うのですが、現在の Groonga ではいったん delete した後に新しい 
> _key で load し直すしか方法がなさそうに思えます。
> 実際には body 以外の属性もたくさんあり、「delete して load し直し」はな
> るべくやりたくありません。

更新するときはselect --filter 'path @^ "/XXX"'で更新対象
の_keyを調べて

load --table Files
[
{"_key": 2, "path": "/FolderA/article1"}
]

のようにします。

更新が少し面倒ですかねぇ。。。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/>

Groongaベースの全文検索システムを総合サポート:
  http://groonga.org/ja/support/
パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
  http://www.clear-code.com/recruitment/
コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
  http://www.clear-code.com/services/code-reader/




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index