oracle - 忽略 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');
解决方案
将BASE_LETTER_TYPE
设置设置为SPECIFIC
。其默认设置GENERIC
不会应用特定于语言的规则。
从文档:
SPECIFIC 值意味着将使用专门为您的语言定义的基本字母转换。这使您能够使用重音敏感搜索以您自己的语言搜索单词,同时忽略来自其他语言的重音。
重要的是要了解这会影响实际的索引内容(索引标记存储时删除了“变音符号”),而不仅仅是运行时的查询。必须重建全文索引才能生效。
ctx_ddl.set_attribute('my_lexer','base_letter_type','SPECIFIC');
推荐阅读
- haskell - 在 F# 中对任意嵌套级别的列表求和
- asp.net - 带有服务、存储库和 Web api 的 Autofac
- apache-spark - 在 PySpark 中计算 Spark DataFrame 两列之间的余弦相似度
- node.js - 通过 ssh 转义节点中的 bash 变量
- css - 样式未从后端解析
- c++ - asn1c 不会从 asn.1 模块中提取 OCTET STRING 的 DEFAULT 值
- conditional-statements - 用扫描仪检查条件循环
- javascript - 打字稿 - 在函数返回块中使用从那时起的值
- javascript - React 在第三个状态下合并两个状态
- windows - 如何访问 Windows 白板应用程序并跟踪笔和触摸输入