用户定义的分析器根据用户定义的函数,将文本处理为标记。
您可以编写用户定义的函数,以根据自己的需要将文本处理为标记。在创建 Basic Text Search 索引时,将 udr.function_name 作为分析器名称与 analyzer 选项一起使用。
以下用 C 语言编写的函数将字母和数字字符处理为标记,并忽略除下划线 (_) 之外的所有特殊字符:
/*ARGSUSED*/ UDREXPORT mi_lvarchar* tokenize_alnum( mi_lvarchar* string, MI_FPARAM* fparam) { mi_integer status = MI_OK; mi_lvarchar* rtn = NULL; gl_mchar_t* src = NULL; gl_mchar_t* tgt = NULL; mi_integer token = 0; gl_mchar_t* s; gl_mchar_t* r; ifx_gl_init(); if (((src = (gl_mchar_t*)mi_lvarchar_to_string(string)) == NULL) || ((tgt = (gl_mchar_t*)mi_alloc((strlen(src)*4)+1)) == NULL)) { status = MI_ERROR; goto cleanup; } s = src; r = tgt; while ((s != NULL) && (*s != '\0')) { if ((ifx_gl_ismalnum(s, IFX_GL_NO_LIMIT)) || (*s == '_')) { if (!token) { if (r != tgt) *r++ = ' '; *r++ = '['; token = 1; } ifx_gl_mbsncpy(r, s, IFX_GL_NULL, 1); r = ifx_gl_mbsnext(r, IFX_GL_NO_LIMIT); } else { if (token) { *r++ = ']'; token = 0; } } s = ifx_gl_mbsnext(s, IFX_GL_NO_LIMIT); } if (token) *r++ = ']'; *r = '\0'; if ((rtn = mi_string_to_lvarchar((char*)tgt)) == NULL) { status = MI_ERROR; goto cleanup; } cleanup: if ((status != MI_OK) && (rtn != NULL)) { mi_var_free(rtn); rtn = NULL; } if (tgt != NULL) mi_free(tgt); if (src != NULL) mi_free(src); if (rtn == NULL) mi_fp_setreturnisnull(fparam, 0, MI_TRUE); return rtn; }
以下语句注册函数,以使数据库服务器可以使用此函数:
CREATE FUNCTION tokenize_alnum (lvarchar) RETURNS lvarchar WITH (NOT VARIANT) EXTERNAL NAME "$GBASEDBTDIR/extend/myblade/myblade.bld(tokenize_alnum)" LANGUAGE C;
使用 analyzer="udr.tokenize_alnum" 选项创建索引时,以下示例显示没有对除下划线之外的特殊字符建立索引:
quick! #$%&^^$## Brown fox under_score [quick] [Brown] [fox] [under_score]