在Oracle文本索引中忽略阿拉伯文发音符号

在Oracle文本索引中忽略阿拉伯文发音符号,oracle,oracle12c,oracle-text,Oracle,Oracle12c,Oracle Text,在Oracle数据库12c R2中,我主要存储阿拉伯语文本,并使用Oracle文本包含搜索 在阿拉伯语中,某些不同的字符可以互换使用,在搜索时应同等对待 例1:以下字符(أ-إ-آ-ا)应被视为相同的字符 例2:这些字符组中的每一个都应该被同样对待(ي-ى),(ة-ه) 此外,变音符号(被称为Tashkeel)也应该被忽略 例3:(َ-ً-ُ-ِ-ٍ-ّ-ْ-ـ)所有这些都应该被忽略 当我使用Auto_Lexer并将language属性设置为Arabic(或使用Basic_Lexer)并启用BA

在Oracle数据库12c R2中,我主要存储阿拉伯语文本,并使用Oracle文本包含搜索

在阿拉伯语中,某些不同的字符可以互换使用,在搜索时应同等对待

例1:以下字符(أ-إ-آ-ا)应被视为相同的字符

例2:这些字符组中的每一个都应该被同样对待(ي-ى),(ة-ه)

此外,变音符号(被称为Tashkeel)也应该被忽略

例3:(َ-ً-ُ-ِ-ٍ-ّ-ْ-ـ)所有这些都应该被忽略

当我使用Auto_Lexer并将language属性设置为Arabic(或使用Basic_Lexer)并启用BASE_LETTER时,第一个示例中的字符组将被同等对待,但这些设置不会更改Ex2和Ex3中字符组的行为

是否有一种方法可以调整和扩展这个基本字母转换,以实现我在Ex1中获得的相同行为,或者任何其他不包括在插入时修改文本的解决方案

下面是一个代码示例:

Create Table DOCUMENT(SUBJECT VARCHAR2(4000 CHAR));

begin
 ctx_ddl.create_preference('my_lexer','AUTO_LEXER');
 ctx_ddl.set_attribute('my_lexer','language','ARABIC');
 ctx_ddl.set_attribute('my_lexer','base_letter','YES');
end;
/


insert into DOCUMENT(SUBJECT) VALUES ('السيد أحمد')  ;
insert into DOCUMENT(SUBJECT) VALUES ('سيادة القاضي')  ;
commit;


create index IX_FULLTEXT_SUBJECT on DOCUMENT (SUBJECT)
  indextype is CTXSYS.CONTEXT
  parameters('SYNC(ON COMMIT) lexer my_lexer');


select * from DOCUMENT  where contains(SUBJECT,'احمد') > 0 ; -- this will return a result
select * from DOCUMENT  where contains(SUBJECT,'القاضى') > 0; -- this won't return a result
注:我将NLS_LANG设置为“ARABIC_阿联酋.AR8MSWIN1256”

先谢谢你

编辑: 我已经尝试了base\u letter\u type属性,但没有任何用处

ctx_ddl.set_attribute('my_lexer','base_letter_type','SPECIFIC');

BASE\u LETTER\u TYPE
设置设置为
SPECIFIC
。它的默认设置
GENERIC
将不应用特定于语言的规则

发件人:

特定值表示具有 将使用专门为您的语言定义的。这使得 您可以使用重音敏感搜索自己语言中的单词, 而忽略来自其他语言的口音

重要的是要理解这会影响实际的索引内容(索引标记存储时删除了“dicritics”),而不仅仅是查询运行时。必须重建全文索引才能使其生效

ctx_ddl.set_attribute('my_lexer','base_letter_type','SPECIFIC');

关于这方面的文件是有限的,但特别是关于阿拉伯语的详细资料有限。我们可以肯定的是,模糊匹配不适用于阿拉伯语。因此,我能找到的唯一提示是,base_字母在默认情况下仅适用于以空格分隔的语言,而带有合并符号的阿拉伯语则不适用。我的最佳选择是尝试
BASE\u LETTER\u TYPE SPECIFIC
。我已经尝试了这个选项,但没有效果,我的坏消息是在我的帖子中没有提到这一点。你是否也完全重新创建了索引(drop index+create index),并且这个设置生效了?当然,“BASE\u LETTER\u TYPE”在创建索引之前被设置为首选项。