HyperEstraier: @uri属性の重複による文書削除
 2006.08.06

@uri属性はデータベース内で一意である必要がある. もし,同一の@uri属性を持つ文書doc1, doc2をdoc1, doc2の順に登録すると,doc1は削除される. しかしながら,doc1に含まれるキーワードで検索した場合にはest_db_search() の結果で得られる文書ID配列には doc1 のIDが含まれる. estcmd optimize を使ってデータベースの最適化を行うと,同じキーワードで検索してもdoc1はHITしなくなる. estcmd optimize を実行しないまま,est_db_get_doc() でdoc1文書の取得を試みると,NULLが返る.NULLが返るときの対処はプログラマの責任である.このことは,Programming Guideにも以下のように,きちんと記述されている.
検索結果が得られたら、あとはそれに含まれる個々の文書を取り出してから表示します。est_db_get_docはIDに対応した文書オブジェクトを取り出す関数です。既に削除した文書がヒットすることもあるので、その場合にはNULLが返されます。NULLの場合は単に無視して次の周回に進みます。
自分では文書を削除したつもりはなくても,@uri属性がダブルことで文書は削除され,そのうえ検索結果には削除された文書のIDが含まれ,est_db_get_doc()がNULLを返す‥という事態にハマったのでここに書き記す. ちなみに,hyperestraier-1.2.8を使ってます. 2006/8/8追記: プログラミングガイドの「ギャザラのサンプル」のセクションにそのものズバリの記述があった.なのでタイトルの「意外」の部分を変更しました.
既に登録してある文書のURIと重複した場合は、上書き(既存の文書が削除)されます。
カテゴリー:hyperestraier