首页 > 解决方案 > 忽略 Oracle 文本索引中的阿拉伯语变音符号

问题描述

在 Oracle Database 12c R2 中,我主要存储阿拉伯文本,并使用 oracle 文本 CONTAINS 搜索。

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

Ex1:以下字符(أ - إ - آ - ا)应被同等对待。

Ex2:这些字符组中的每一个也应该被视为相同的 (ي - ى) , (ة - ه)。

此外,应忽略变音符号(称为 Tashkeel)。

Ex3: ( َ - ً - ُ - ِ - ٍ - ّ - ْ - ـ) 都应该被忽略。

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

有没有办法调整和扩展这个 base_letter 转换以完成我在 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_UNITED ARAB EMIRATES.AR8MSWIN1256”

并提前感谢。

编辑:我已经尝试过 base_letter_type 属性也没有用

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

标签: oracleoracle12coracle-text

解决方案


BASE_LETTER_TYPE设置设置为SPECIFIC。其默认设置GENERIC不会应用特定于语言的规则。

文档

SPECIFIC 值意味着将使用专门为您的语言定义的基本字母转换。这使您能够使用重音敏感搜索以您自己的语言搜索单词,同时忽略来自其他语言的重音。

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

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

推荐阅读