Kouhei Sutou
kou****@cozmi*****
2008年 7月 29日 (火) 09:18:27 JST
須藤です。
SEN_PAT_WITH_SISを指定していないsen_patに対する
sen_pat_suffix_search()では検索キーに対して後方部分一
致(?)したキーがヒットしないのですが、これはそうい
うものなのでしょうか?suffix_searchとなっていたので、
SEN_PAT_WITH_SISを指定していなくても頑張るのかと
思ってしまいました。
↓のプログラムの実行例です。
key: ナ: 9
key: セ: 9
key: セナ: 0
セナ
key: ナセナ: 9
実験プログラム
#include <stdio.h>
#include <string.h>
#include <pat.h>
#include <hash.h>
static sen_id
add(sen_ctx *context, sen_pat *pat, const char *key)
{
sen_table_search_flags flags;
flags = SEN_TABLE_ADD;
return sen_pat_lookup(context, pat, key, strlen(key), NULL, &flags);
}
#define BUFFER_SIZE 4096
static void
dump(sen_ctx *context, sen_pat *pat, const char *key)
{
sen_id id;
sen_hash *hash;
sen_hash_cursor *cursor;
sen_rc rc;
hash = sen_hash_create(context, NULL, sizeof(sen_id),
0, SEN_HASH_TINY, sen_enc_utf8);
rc = sen_pat_suffix_search(context, pat, key, strlen(key), hash);
printf("key: %s: %d\n", key, rc);
cursor = sen_hash_cursor_open(context, hash,
NULL, 0, NULL, 0,
SEN_CURSOR_DESCENDING);
id = sen_hash_cursor_next(context, cursor);
while (id != SEN_ID_NIL) {
sen_id *pat_id;
void *hash_key;
char key[BUFFER_SIZE];
int size;
sen_hash_cursor_get_key(context, cursor, &hash_key);
pat_id = hash_key;
size = sen_pat_get_key(context, pat, *pat_id, key, sizeof(key));
key[size] = '\0';
printf("%s\n", key);
id = sen_hash_cursor_next(context, cursor);
}
printf("\n");
sen_hash_cursor_close(context, cursor);
sen_hash_close(context, hash);
}
int
main(int argc, char **argv)
{
sen_ctx *context;
sen_pat *pat;
sen_init();
context = sen_ctx_open(NULL, SEN_CTX_USEQL);
pat = sen_pat_create(context, "/tmp/xxx", 128, 64,
0, /* SEN_PAT_WITH_SIS, */
sen_enc_utf8);
add(context, pat, "セナ");
add(context, pat, "ナセナセ");
add(context, pat, "Senna");
add(context, pat, "セナ + Ruby");
add(context, pat, "セナセナ");
dump(context, pat, "ナ");
dump(context, pat, "セ");
dump(context, pat, "セナ");
dump(context, pat, "ナセナ");
sen_pat_close(context, pat);
sen_ctx_close(context);
sen_fin();
return 0;
}