[Senna-dev 983] Re: sen_pat_suffix_search() without SIS

Back to archive index

Tasuku SUENAGA a****@razil*****
2008年 7月 29日 (火) 13:09:11 JST


末永です。

「セナセナ」というエントリを追加すると、
内部的には
* ナセナ
* セナ
* ナ
という半無限文字列(=SIS)を登録し、
これら全てに対して前方一致検索を行うことによって
高速な後方一致検索を実現しています。

SISを全てエントリに入れるとエントリ数が増えてしまうので、
それを出来るようにするかどうかを選択制にしてあります。
それが、SEN_PAT_WITH_SISフラグです。

SEN_PAT_WITH_SISフラグがない場合には、
sen_pat_suffix_searchがエラーを返すようにしたほうが
いいかもしれないですね。

Kouhei Sutou さんは書きました:
> 須藤です。
> 
> 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;
>   }
> 
> _______________________________________________
> Senna-dev mailing list
> Senna****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> バグ報告方法:http://qwik.jp/senna/bug_report.html
---
Tasuku SUENAGA




Senna-dev メーリングリストの案内
Back to archive index