.. -*- rst -*- .. highlightlang:: none ã¯ã¨ãªã®å®ç¾ ============ groongaã®ãã¼ã¿ãã¼ã¹ã«ã¯å¤§éã®ãã¼ã¿ãæ ¼ç´ãããã®ä¸ããå¿ è¦ãªé¨åãé«éã«åãåºããã¨ãã§ãã¾ããå¿ è¦ãªé¨åãgroongaã®ãã¼ã¿ãã¼ã¹ã«åãåãããããã®ã¯ã¨ãªã®è¡¨ç¾ã¨å®è¡ã«é¢ãã¦ãgroongaã¯è¤æ°ã®æ段ãç¨æãã¦ãã¾ãã ã¯ã¨ãªå®è¡ã®ããã®ã¤ã³ã¿ãã§ã¼ã¹ -------------------------------- groongaã¯ä½æ©è½ã§åç´ãªã©ã¤ãã©ãªã¤ã³ã¿ãã§ã¼ã¹ãããé«æ©è½ã§è¤éãªã³ãã³ãã¤ã³ã¿ãã§ã¼ã¹ã¾ã§ããã¤ãã®é層çãªã¤ã³ã¿ãã§ã¼ã¹ãã¦ã¼ã¶ããã°ã©ã ã«æä¾ãã¦ãã¾ãã ã¯ã¨ãªå®è¡ã®ããã®ã¤ã³ã¿ãã§ã¼ã¹ãé層çãªã¤ã³ã¿ãã§ã¼ã¹ã®ããããã«å¯¾å¿ããå½¢ã§ç¨æããã¦ãã¾ãã以ä¸ã«ä½ã¬ã¤ã¤ãªã¤ã³ã¿ãã§ã¼ã¹ããé ã«èª¬æãã¾ãã DB_API ^^^^^^ DB_APIã¯ãgroongaãã¼ã¿ãã¼ã¹ãæä½ããããã®ä¸ç¾¤ã®Cè¨èªåãAPIé¢æ°ãæä¾ãã¾ããDB_APIã¯ãã¼ã¿ãã¼ã¹ãæ§æããåã ã®é¨åã«å¯¾ããåç´ãªæä½é¢æ°ãæä¾ãã¾ããDB_APIã®æ©è½ãçµã¿åããããã¨ã«ãã£ã¦è¤éãªã¯ã¨ãªãå®è¡ãããã¨ãã§ãã¾ããå¾è¿°ã®ãã¹ã¦ã®ã¯ã¨ãªã¤ã³ã¿ãã§ã¼ã¹ã¯DB_APIã®æ©è½ãçµã¿åããããã¨ã«ãã£ã¦å®ç¾ããã¦ãã¾ãã grn_expr ^^^^^^^^ grn_exprã¯ãgroongaãã¼ã¿ãã¼ã¹ã«å¯¾ããæ¤ç´¢å¦çãæ´æ°å¦çã®ããã®æ¡ä»¶ã表ç¾ããããã®ãã¼ã¿æ§é ã§ãè¤æ°ã®æ¡ä»¶ãå帰çã«çµã¿åããã¦ããè¤éãªæ¡ä»¶ã表ç¾ãããã¨ãã§ãã¾ããgrn_exprã«ãã£ã¦è¡¨ç¾ãããã¯ã¨ãªãå®è¡ããããã«ã¯ãgrn_table_select()é¢æ°ã使ç¨ãã¾ãã groongaå®è¡ãã¡ã¤ã« ^^^^^^^^^^^^^^^^^^^ groongaãã¼ã¿ãã¼ã¹ãæä½ããããã®ã³ãã³ãã¤ã³ã¿ã¼ããªã¿ã§ãã渡ãããã³ãã³ãã解éããå®è¡çµæãè¿ãã¾ããã³ãã³ãã®å®å¦çã¯Cè¨èªã§è¨è¿°ããã¾ããã¦ã¼ã¶ãCè¨èªã§å®ç¾©ããé¢æ°ãæ°ããªã³ãã³ãã¨ãã¦groongaå®è¡ãã¡ã¤ã«ã«çµã¿è¾¼ããã¨ãã§ãã¾ããåã³ãã³ãã¯ããã¤ãã®æååå¼æ°ãåãåãããããã¯ã¨ãªã¨ãã¦è§£éãã¦å®è¡ãã¾ããå¼æ°ãgrn_exprã¨ãã¦è§£éããããå¥ã®å½¢å¼ã¨ãã¦è§£éãã¦DB_APIã使ã£ã¦ãã¼ã¿ãã¼ã¹ãæä½ãããã¯ã³ãã³ãæ¯ã«èªç±ã«æ±ºãããã¨ãã§ãã¾ãã grn_exprã§è¡¨ç¾ã§ããã¯ã¨ãª -------------------------- grn_exprã¯ä»£å ¥ãé¢æ°å¼ã³åºãã®ãããªæ§ã ãªæä½ã表ç¾ã§ãã¾ããããã®ä¸ã§æ¤ç´¢ã¯ã¨ãªã表ç¾ããgrn_exprã®ãã¨ãç¹ã«æ¡ä»¶å¼ã¨ãã³ã¾ããæ¡ä»¶å¼ãæ§æããåã ã®è¦ç´ ãé¢ä¿å¼ã¨å¼ã³ã¾ããæ¡ä»¶å¼ã¯ä¸å以ä¸ã®é¢ä¿å¼ãããããã¯æ¡ä»¶å¼ãè«çæ¼ç®åã§çµåãããã®ã§ãã è«çæ¼ç®åã¯ã以ä¸ã®3種é¡ãããã¾ãã :: && (è«çç©) || (è«çå) ! (å¦å®) é¢ä¿å¼ã¯ãä¸è¨ã®11種é¡ãç¨æããã¦ãã¾ããã¾ããã¦ã¼ã¶ãå®ç¾©ããé¢æ°ãæ°ããªé¢ä¿å¼ã¨ãã¦ä½¿ããã¨ãã§ãã¾ãã :: equal(==) not_equal(!=) less(<) greater(>) less_equal(<=) greater_equal(>=) contain() near() similar() prefix() suffix() grn_table_select() ------------------ grn_table_select()é¢æ°ã¯ãgrn_exprã§è¡¨ç¾ãããæ¤ç´¢ã¯ã¨ãªãå®è¡ããã¨ãã«ä½¿ãã¾ããå¼æ°ã¨ãã¦ãæ¤ç´¢å¯¾è±¡ã¨ãªããã¼ãã«ãã¯ã¨ãªã表ãgrn_exprãæ¤ç´¢çµæãæ ¼ç´ãããã¼ãã«ãããã«æ¤ç´¢ã«ãããããã¬ã³ã¼ããæ¤ç´¢çµæã«ã©ã®ããã«åæ ããããæå®ããæ¼ç®åã渡ãã¾ããæ¼ç®åã¨æå®ã§ããã®ã¯ä¸è¨ã®4種é¡ã§ãã :: GRN_OP_OR GRN_OP_AND GRN_OP_BUT GRN_OP_ADJUST GRN_OP_ORã¯ãæ¤ç´¢å¯¾è±¡ãã¼ãã«ã®ä¸ããã¯ã¨ãªã«ãããããã¬ã³ã¼ããæ¤ç´¢çµæãã¼ãã«ã«å ãã¾ããGRN_OP_OR以å¤ã®æ¼ç®åã¯ãæ¤ç´¢çµæãã¼ãã«ã空ã§ãªãå ´åã«ã ãæå³ãæã¡ã¾ããGRN_OP_ANDã¯ãæ¤ç´¢çµæãã¼ãã«ã®ä¸ããã¯ã¨ãªã«ãããããªãã¬ã³ã¼ããåãé¤ãã¾ããGRN_OP_BUTã¯ãæ¤ç´¢çµæãã¼ãã«ã®ä¸ããã¯ã¨ãªã«ãããããã¬ã³ã¼ããåãé¤ãã¾ããGRN_OP_ADJUSTã¯ãæ¤ç´¢çµæãã¼ãã«ã®ä¸ã§ã¯ã¨ãªã«ãããããã¬ã³ã¼ãã«å¯¾ãã¦ã¹ã³ã¢å¤ã®æ´æ°ã®ã¿ãè¡ãã¾ãã grn_table_select()ã¯ããã¼ã¿ãã¼ã¹ä¸ã«å®ç¾©ããããã¼ãã«ãç´¢å¼ãªã©ãçµã¿åããã¦å¯è½ãªéãé«éã«æå®ãããã¯ã¨ãªãå®è¡ãããã¨ãã¾ãã é¢ä¿å¼ ------ é¢ä¿å¼ã¯ãæ¤ç´¢ãããã¨ãã¦ãããã¼ã¿ãæºããã¹ãæ¡ä»¶ããæå®ããå¤ã®éã®é¢ä¿ã¨ãã¦è¡¨ç¾ãã¾ãããããã®é¢ä¿å¼ãããã®é¢ä¿ãæãç«ã£ãã¨ãã«è©ä¾¡ãããcallbackãã³ã¼ã«ããã¯é¢æ°ã«æ¸¡ãããargã¨ãå¼æ°ã¨ãã¦æå®ãããã¨ãã§ãã¾ããcallbackãä¸ãããããargã®ã¿ãæ°å¤ã§ä¸ããããå ´åã¯ã¹ã³ã¢å¤ã®ä¿æ°ã¨ã¿ãªããã¾ãã主ãªé¢ä¿å¼ã«ã¤ãã¦èª¬æãã¾ãã equal(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ã¨v2ã®å¤ãçãããã¨ã表ãã¾ãã not_equal(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ã¨v2ã®å¤ãçãããªããã¨ã表ãã¾ãã less(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ãããå°ãããã¨ã表ãã¾ãã greater(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ããã大ãããã¨ã表ãã¾ãã less_equal(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ã¨çãããå°ãããã¨ã表ãã¾ãã greater_equal(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ã¨çããã大ãããã¨ã表ãã¾ãã contain(v1, v2, mode, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ãå«ãã§ãããã¨ã表ãã¾ããã¾ããv1ã®å¤ãè¦ç´ ã«å解ãããã¨ããããããã®è¦ç´ ã«å¯¾ãã¦äºã¤ç®ã®è¦ç´ ãä¸è´ããããã®modeã¨ãã¦ä¸è¨ã®ãããããæå®ãããã¨ãã§ãã¾ãã :: EXACT: v2ã®å¤ãv1ã®å¤ã¨åæ§ã«è¦ç´ ã«å解ããã¨ããããããã®è¦ç´ ãå®å ¨ã«ä¸è´ãã(ããã©ã«ã) UNSPLIT: v2ã®å¤ã¯è¦ç´ ã«å解ããªã PREFIX: v1ã®å¤ã®è¦ç´ ãv2ã®å¤ã«åæ¹ä¸è´ãã SUFFIX: v1ã®å¤ã®è¦ç´ ãv2ã®å¤ã«å¾æ¹ä¸è´ãã PARTIAL: v1ã®å¤ã®è¦ç´ ãv2ã®å¤ã«ä¸éä¸è´ãã near(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ã®ä¸ã«ãv2ã®å¤ã®è¦ç´ ãæ¥è¿ãã¦å«ã¾ãã¦ãããã¨ã表ãã¾ãã(v2ã«ã¯å¤ã®é åã渡ãã¾ã) similar(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ã¨v2ã®å¤ãé¡ä¼¼ãã¦ãããã¨ã表ãã¾ãã prefix(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ã«å¯¾ãã¦åæ¹ä¸è´ãããã¨ã表ãã¾ãã suffix(v1, v2, arg, callback) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ v1ã®å¤ãv2ã®å¤ã«å¯¾ãã¦å¾æ¹ä¸è´ãããã¨ã表ãã¾ãã ã¯ã¨ãªã®å®ä¾ ============ grn_exprã使ã£ã¦æ§ã ãªæ¤ç´¢ã¯ã¨ãªã表ç¾ãããã¨ãã§ãã¾ãã æ¤ç´¢ä¾1 ------- :: GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); tableã®columnã®å¤ãstringãå«ãã¬ã³ã¼ããresultã«è¿ãã¾ããcolumnã®å¤ã'needle in haystack'ã§ããã¬ã³ã¼ãr1ã¨ãcolumnã®å¤ã'haystack'ã§ããã¬ã³ã¼ãr2ãtableã«ç»é²ããã¦ããã¨ããstringã«'needle'ãæå®ãããªããã¬ã³ã¼ãr1ã®ã¿ãããããã¾ãã æ¤ç´¢ä¾2 ------- :: GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); grn_obj_close(ctx, query); GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column2, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); grn_table_select(ctx, table, query, result, GRN_OP_ADJUST); grn_obj_close(ctx, query); tableã®column1ã®å¤ãstringã«exactã¢ã¼ãã§ãããããã¬ã³ã¼ãã«ã¤ãã¦å¾ãããã¹ã³ã¢å¤ã«score1ãç©ç®ãã¦resultã«ã»ãããã¾ãã次ã«ãresultã«ã»ãããããã¬ã³ã¼ãã®ãã¡ãcolumn2ã®å¤ãstringã«exactã¢ã¼ãã§ãããããã¬ã³ã¼ãã«ã¤ãã¦ã¯ãå¾ãããã¹ã³ã¢å¤ã«score2ãç©ç®ãããã®ããå ã®ã¹ã³ã¢å¤ã«å ãã¾ãã æ¤ç´¢ä¾3 ------- :: GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, exact, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score1, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 5); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); grn_obj_close(ctx, query); if (grn_table_size(ctx, result) < t1) { GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column1, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, partial, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, score2, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); grn_table_select(ctx, table, query, result, GRN_OP_OR); grn_obj_close(ctx, query); } tableã®column1ã®å¤ãstringã«exactã¢ã¼ãã§ãããããã¬ã³ã¼ãã«ã¤ãã¦å¾ãããã¹ã³ã¢å¤ã«score1ãç©ç®ãã¦resultã«ã»ãããã¾ããå¾ãããæ¤ç´¢çµææ°ãt1ãããå°ããå ´åã¯ãpartialã¢ã¼ãã§å度æ¤ç´¢ãããããããã¬ã³ã¼ãã«ã¤ãã¦å¾ãããã¹ã³ã¢å¤ã«score2ãç©ç®ãã¦resultã«è¿½å ãã¾ãã æ¤ç´¢ä¾4 ------- :: GRN_EXPR_CREATE_FOR_QUERY(ctx, table, query, var); grn_expr_append_obj(ctx, query, contain, GRN_OP_PUSH, 1); grn_expr_append_const(ctx, query, string, GRN_OP_PUSH, 1); grn_expr_append_obj(ctx, query, column, GRN_OP_PUSH, 1); grn_expr_append_op(ctx, query, GRN_OP_CALL, 3); result = grn_table_select(ctx, table, query, NULL, GRN_OP_OR); tableã®columnã®å¤ãstringã«å«ã¾ããã¬ã³ã¼ããresultã«è¿ãã¾ãã columnã®å¤ã'needle'ã§ããã¬ã³ã¼ãr1ã¨ãcolumnã®å¤ã'haystack'ã§ããã¬ã³ã¼ãr2ãtableã«ç»é²ããã¦ããã¨ããstringã«'hay in haystack'ãæå®ãããªããã¬ã³ã¼ãr2ã®ã¿ãããããã¾ãã