Akihiro YAMANOI
a.yam****@gmail*****
2008年 3月 5日 (水) 18:06:35 JST
山野井です。 sen_query_exec()関数への要望です。段落単位や出現位置単位に設定したレコードに対し、 検索結果を追加・削除する際の動作に関してです。 以下の手順で検索クエリを発行し、段落単位での検索結果を得たいと考えています。 (1). sen_records_open()の引数record_unitに「sen_rec_section」を指定し、検索結果を段落単位に設定する。 (2). sen_query_exec()でクエリを発行し、結果をrに得る。 (3). sen_query_exec()で別のクエリを発行し、結果をrに追加する。 以下のようなプログラムになります。 --- sen_index *i = sen_index_open("/path/to/index"); sen_records *r = sen_records_open(sen_rec_section, sen_rec_none, 0); /* (1) */ { sen_query *q = sen_query_open("query string", 12, sen_sel_and, 32, sen_enc_utf8); sen_query_exec(i, q, r, sen_sel_or); /* (2) */ } { sen_query *q = sen_query_open("another query", 13, sen_sel_and, 32, sen_enc_utf8); sen_query_exec(i, q, r, sen_sel_or); /* (3) */ } --- Senna-1.1.1で上記を実行してみた結果、(2)の結果は期待通りに得られるのですが、 (3)の検索結果がrに反映されませんでした。 query.cファイルを覗いてみたところ、485行目辺りに以下のような記述があります。 s = n ? sen_records_open(sen_rec_document, sen_rec_none, 0) : r; どうやらrとsの単位が不一致のため動作しないのではと思い、以下のように無理矢理 単位を一致させるよう書き換えてsennaを再コンパイルしたところ、上記プログラムが 期待通りの動作をするようになりました。 s = n ? sen_records_open(r->record_unit, r->subrec_unit, 0) : r; →1件以上の検索結果が入ったレコードに対して、 sen_query_exec()が結果を追加・削除できるのは sen_rec_document単位の場合のみという仕様(?) 現在のところ(senna本体は書き換えず)、この仕様を避けるために呼び出し側で 空のレコードをsen_query_exec()に渡して結果を得た後、sen_records_union()等を 呼ぶようなコードを書いています。 (良く見るとsen_query_exec()関数内に同じ事をしているswitch文がありました) 段落単位や出現位置単位に設定したレコードに対してもsen_query_exec()だけで 検索結果を反映できるようになれば、重複したコードを書かなくて良くなり便利 だと思います。もしもSennaの仕様上可能でしたら、ぜひご一考下さい! どうぞよろしくお願いいたします。