[Groonga-commit] groonga/groonga [master] Normalized query with RK suggest.

Back to archive index

null+****@clear***** null+****@clear*****
2010年 8月 26日 (木) 15:28:03 JST


Tasuku SUENAGA a.k.a. gunyarakun	2010-08-26 06:28:03 +0000 (Thu, 26 Aug 2010)

  New Revision: 06cff725a839839796fb7b5c4407264de4b43adb

  Log:
    Normalized query with RK suggest.

  Modified files:
    modules/suggest/suggest.c

  Modified: modules/suggest/suggest.c (+108 -103)
===================================================================
--- modules/suggest/suggest.c    2010-08-25 13:15:07 +0000 (6d30b65)
+++ modules/suggest/suggest.c    2010-08-26 06:28:03 +0000 (2a60a2a)
@@ -37,126 +37,131 @@ command_suggest(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_dat
         grn_obj *sorted;
         if ((sorted = grn_table_create(ctx, NULL, 0, NULL,
                                        GRN_OBJ_TABLE_NO_KEY, NULL, res))) {
+          grn_str *norm;
+          if ((norm = grn_str_open(ctx, GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)),
+                                   GRN_STR_NORMALIZE))) {
 #if 1
-          /* RK search */
-          grn_obj *index;
-          /* FIXME: support index selection */
-          if (grn_column_index(ctx, col, GRN_OP_PREFIX,
-                               &index, 1, NULL)) {
-            grn_table_cursor *cur;
-            if ((cur = grn_table_cursor_open(ctx, grn_ctx_at(ctx, index->header.domain),
-                                             GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)),
-                                             NULL, 0,
-                                             0, -1,
-                                             GRN_CURSOR_PREFIX | GRN_CURSOR_RK))) {
-              grn_id id;
-              while ((id = grn_table_cursor_next(ctx, cur))) {
-                grn_ii_cursor *icur;
-                if ((icur = grn_ii_cursor_open(ctx, (grn_ii *)index, id,
-                                               GRN_ID_NIL, GRN_ID_MAX, 1, 0))) {
-                  grn_ii_posting *p;
-                  while ((p = grn_ii_cursor_next(ctx, icur))) {
-                    grn_hash_add(ctx, (grn_hash *)res, &p->rid, sizeof(grn_id), NULL, NULL);
-                    /* FIXME: execute _score = score */
+            /* RK search */
+            grn_obj *index;
+            /* FIXME: support index selection */
+            if (grn_column_index(ctx, col, GRN_OP_PREFIX,
+                                 &index, 1, NULL)) {
+              grn_table_cursor *cur;
+              if ((cur = grn_table_cursor_open(ctx, grn_ctx_at(ctx, index->header.domain),
+                                               norm->norm, norm->norm_blen,
+                                               NULL, 0,
+                                               0, -1,
+                                               GRN_CURSOR_PREFIX | GRN_CURSOR_RK))) {
+                grn_id id;
+                while ((id = grn_table_cursor_next(ctx, cur))) {
+                  grn_ii_cursor *icur;
+                  if ((icur = grn_ii_cursor_open(ctx, (grn_ii *)index, id,
+                                                 GRN_ID_NIL, GRN_ID_MAX, 1, 0))) {
+                    grn_ii_posting *p;
+                    while ((p = grn_ii_cursor_next(ctx, icur))) {
+                      grn_hash_add(ctx, (grn_hash *)res, &p->rid, sizeof(grn_id), NULL, NULL);
+                      /* FIXME: execute _score = score */
+                    }
+                    grn_ii_cursor_close(ctx, icur);
                   }
-                  grn_ii_cursor_close(ctx, icur);
                 }
+                grn_table_cursor_close(ctx, cur);
+              } else {
+                ERR(GRN_UNKNOWN_ERROR, "cannot open cursor for pk.");
+                goto exit;
               }
-              grn_table_cursor_close(ctx, cur);
             } else {
-              ERR(GRN_UNKNOWN_ERROR, "cannot open cursor for pk.");
+              ERR(GRN_UNKNOWN_ERROR, "cannot find index for prefix search.");
               goto exit;
             }
-          } else {
-            ERR(GRN_UNKNOWN_ERROR, "cannot find index for prefix search.");
-            goto exit;
-          }
 #else
-          grn_select_optarg optarg;
-          memset(&optarg, 0, sizeof(grn_select_optarg));
-          optarg.mode = GRN_OP_SIMILAR;
-          optarg.similarity_threshold = 1048576;
-
-          grn_ii_select(ctx, (grn_ii *)grn_ctx_get(ctx, CONST_STR_LEN("SuggestBigram.suggest_key")),
-                        GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)),
-                        (grn_hash *)res, GRN_OP_OR, &optarg);
-          {
-            /* exec _score = edit_distance(_key, "query string") for all records */
-            grn_obj *var;
-            grn_obj *expr;
-
-            GRN_EXPR_CREATE_FOR_QUERY(ctx, res, expr, var);
-            if (expr) {
-              grn_table_cursor *tc;
-
-              grn_expr_append_obj(ctx, expr,
-                                  grn_obj_column(ctx, res, CONST_STR_LEN("_score")),
-                                  GRN_OP_GET_VALUE, 1);
-              grn_expr_append_obj(ctx, expr,
-                                  grn_ctx_get(ctx, CONST_STR_LEN("edit_distance")),
-                                  GRN_OP_PUSH, 1);
-              grn_expr_append_obj(ctx, expr,
-                                  grn_obj_column(ctx, res, CONST_STR_LEN("_key")),
-                                  GRN_OP_GET_VALUE, 1);
-              grn_expr_append_const(ctx, expr, VAR(2), GRN_OP_PUSH, 1);
-              grn_expr_append_op(ctx, expr, GRN_OP_CALL, 2);
-              grn_expr_append_op(ctx, expr, GRN_OP_ASSIGN, 2);
-
-              if ((tc = grn_table_cursor_open(ctx, res, NULL, 0, NULL, 0, 0, -1, 0))) {
-                while (!grn_table_cursor_next_o(ctx, tc, var)) {
-                  grn_expr_exec(ctx, expr, 0);
+            grn_select_optarg optarg;
+            memset(&optarg, 0, sizeof(grn_select_optarg));
+            optarg.mode = GRN_OP_SIMILAR;
+            optarg.similarity_threshold = 1048576;
+
+            grn_ii_select(ctx, (grn_ii *)grn_ctx_get(ctx, CONST_STR_LEN("SuggestBigram.suggest_key")),
+                          GRN_TEXT_VALUE(VAR(2)), GRN_TEXT_LEN(VAR(2)),
+                          (grn_hash *)res, GRN_OP_OR, &optarg);
+            {
+              /* exec _score = edit_distance(_key, "query string") for all records */
+              grn_obj *var;
+              grn_obj *expr;
+
+              GRN_EXPR_CREATE_FOR_QUERY(ctx, res, expr, var);
+              if (expr) {
+                grn_table_cursor *tc;
+
+                grn_expr_append_obj(ctx, expr,
+                                    grn_obj_column(ctx, res, CONST_STR_LEN("_score")),
+                                    GRN_OP_GET_VALUE, 1);
+                grn_expr_append_obj(ctx, expr,
+                                    grn_ctx_get(ctx, CONST_STR_LEN("edit_distance")),
+                                    GRN_OP_PUSH, 1);
+                grn_expr_append_obj(ctx, expr,
+                                    grn_obj_column(ctx, res, CONST_STR_LEN("_key")),
+                                    GRN_OP_GET_VALUE, 1);
+                grn_expr_append_const(ctx, expr, VAR(2), GRN_OP_PUSH, 1);
+                grn_expr_append_op(ctx, expr, GRN_OP_CALL, 2);
+                grn_expr_append_op(ctx, expr, GRN_OP_ASSIGN, 2);
+
+                if ((tc = grn_table_cursor_open(ctx, res, NULL, 0, NULL, 0, 0, -1, 0))) {
+                  while (!grn_table_cursor_next_o(ctx, tc, var)) {
+                    grn_expr_exec(ctx, expr, 0);
+                  }
+                  grn_table_cursor_close(ctx, tc);
                 }
-                grn_table_cursor_close(ctx, tc);
+                grn_expr_close(ctx, expr);
+              } else {
+                ERR(GRN_UNKNOWN_ERROR, "error on building expr. for calicurating edit distance");
+                goto exit;
               }
-              grn_expr_close(ctx, expr);
-            } else {
-              ERR(GRN_UNKNOWN_ERROR, "error on building expr. for calicurating edit distance");
-              goto exit;
             }
-          }
 #endif
-          /* sort */
-          {
-            uint32_t nkeys;
-            grn_obj *score_col;
-            grn_table_sort_key *keys;
-            score_col = grn_obj_column(ctx, res, CONST_STR_LEN("_score"));
-            /* FIXME: use grn_table_sort instead */
-            if ((keys = grn_table_sort_key_from_str(ctx, CONST_STR_LEN("-_score"), res, &nkeys))) {
-              grn_table_cursor *scur;
-              /* TODO: support offset limit */
-              grn_table_sort(ctx, res, 0, grn_table_size(ctx, res), sorted, keys, nkeys);
-              GRN_OUTPUT_ARRAY_OPEN("RESULTS", -1);
-              if ((scur = grn_table_cursor_open(ctx, sorted, NULL, 0, NULL, 0, 0, -1, 0))) {
-                grn_id id;
-                while ((id = grn_table_cursor_next(ctx, scur))) {
-                  grn_id res_id;
-                  unsigned int key_len;
-                  char key[GRN_TABLE_MAX_KEY_SIZE];
-                  grn_obj score_val;
-
-                  GRN_OUTPUT_ARRAY_OPEN("RESULT", 2);
-                  grn_table_get_key(ctx, sorted, id, &res_id, sizeof(grn_id));
-                  grn_table_get_key(ctx, res, res_id, &id, sizeof(grn_id));
-                  key_len = grn_table_get_key(ctx, table, id, key, GRN_TABLE_MAX_KEY_SIZE);
-                  GRN_OUTPUT_STR(key, key_len);
-
-                  GRN_INT32_INIT(&score_val, 0);
-                  grn_obj_get_value(ctx, score_col, res_id, &score_val);
-                  GRN_OUTPUT_INT32(GRN_INT32_VALUE(&score_val));
-                  GRN_OUTPUT_ARRAY_CLOSE();
+            /* sort */
+            {
+              uint32_t nkeys;
+              grn_obj *score_col;
+              grn_table_sort_key *keys;
+              score_col = grn_obj_column(ctx, res, CONST_STR_LEN("_score"));
+              /* FIXME: use grn_table_sort instead */
+              if ((keys = grn_table_sort_key_from_str(ctx, CONST_STR_LEN("-_score"), res, &nkeys))) {
+                grn_table_cursor *scur;
+                /* TODO: support offset limit */
+                grn_table_sort(ctx, res, 0, grn_table_size(ctx, res), sorted, keys, nkeys);
+                GRN_OUTPUT_ARRAY_OPEN("RESULTS", -1);
+                if ((scur = grn_table_cursor_open(ctx, sorted, NULL, 0, NULL, 0, 0, -1, 0))) {
+                  grn_id id;
+                  while ((id = grn_table_cursor_next(ctx, scur))) {
+                    grn_id res_id;
+                    unsigned int key_len;
+                    char key[GRN_TABLE_MAX_KEY_SIZE];
+                    grn_obj score_val;
+
+                    GRN_OUTPUT_ARRAY_OPEN("RESULT", 2);
+                    grn_table_get_key(ctx, sorted, id, &res_id, sizeof(grn_id));
+                    grn_table_get_key(ctx, res, res_id, &id, sizeof(grn_id));
+                    key_len = grn_table_get_key(ctx, table, id, key, GRN_TABLE_MAX_KEY_SIZE);
+                    GRN_OUTPUT_STR(key, key_len);
+
+                    GRN_INT32_INIT(&score_val, 0);
+                    grn_obj_get_value(ctx, score_col, res_id, &score_val);
+                    GRN_OUTPUT_INT32(GRN_INT32_VALUE(&score_val));
+                    GRN_OUTPUT_ARRAY_CLOSE();
+                  }
+                  grn_table_cursor_close(ctx, scur);
+                } else {
+                  ERR(GRN_UNKNOWN_ERROR, "cannot open sorted cursor.");
                 }
-                grn_table_cursor_close(ctx, scur);
+                GRN_OUTPUT_ARRAY_CLOSE();
+                grn_table_sort_key_close(ctx, keys, nkeys);
               } else {
-                ERR(GRN_UNKNOWN_ERROR, "cannot open sorted cursor.");
+                ERR(GRN_UNKNOWN_ERROR, "cannot sort.");
               }
-              GRN_OUTPUT_ARRAY_CLOSE();
-              grn_table_sort_key_close(ctx, keys, nkeys);
-            } else {
-              ERR(GRN_UNKNOWN_ERROR, "cannot sort.");
             }
-          }
 exit:
+            grn_str_close(ctx, norm);
+          }
           grn_obj_close(ctx, sorted);
         } else {
           ERR(GRN_UNKNOWN_ERROR, "cannot create temporary sort table.");




Groonga-commit メーリングリストの案内
Back to archive index