hyperestraier: インデックスマージ後の@id属性(1)
 2006.10.02

hyperestraierはバージョン1.3.0からインデックスのマージという機能をサポートしています.マージ後のデータにちょっとした問題を発見しました. 以下にその問題を再現する手順を示します.見易いように少し編集したり,コメントを後から加えています.
[yosida@sbt ~/merge]$ estcmd list i0    # i0に1文書
1	file:///home/yosida/merge/s0/hello.txt
[yosida@sbt ~/merge]$ estcmd list i1    # i1に1文書
1	file:///home/yosida/merge/s1/hello.txt
[yosida@sbt ~/merge]$ estcmd merge i0 i1 # i1をi0にマージ
estcmd: INFO: status: name=i0 dnum=1 wnum=4 fsiz=6899768 crnum=0 csiz=0 dknum=0
(中略)
estcmd: INFO: finished successfully: elapsed time: 0h 0m 0s
[yosida@sbt ~/merge]$ estcmd list i0    # i0が2文書になった
1	file:///home/yosida/merge/s0/hello.txt
2	file:///home/yosida/merge/s1/hello.txt
[yosida@sbt ~/merge]$ estcmd get i0 2   # i0のid=2のドラフトの@id属性は 1
@digest=aaddca63c92e1de0331546ee2dfd59ec
@id=1
@size=14
@type=text/plain
@uri=file:///home/yosida/merge/s1/hello.txt
_lfile=hello.txt
_lpath=file:///home/yosida/merge/s1/hello.txt
_lreal=/home/yosida/merge/s1/hello.txt

Hello at "S1"
つまり,マージ後のインデックスでドラフト文書を取り出すと,以前の@id属性の値が残っている.コアAPIを通して使っている限り問題はないと思いますが,ノードAPIを使った場合問題が発生するはずです.

ノードAPIを使うと,検索結果は文書ドラフトを含んだ形で返されます.hyperestraierに同梱されるrubypureやjavapure等の文書ドラフトをパーズしてDocumentオブジェクトを生成するような場合には,文書ドラフトに書かれた@id属性の値を文書IDとして扱ってしまいます.この文書IDを基にデータの更新や削除を行うと意図した文書とは異なる文書をいじってしまい悲しい出来事が起こる...

ちなみに,環境はCentOS4.3(i386), hyperestraier-1.4.0です. MLで質問してみよう.

2006/10/4追記:
hyperestraier: インデックスマージ後の@id属性(2) 続報です.
カテゴリー:技術情報メモ