我想索引像x like '%abc%'
如果我有如下表格
create table t
(
data varchar(100)
);
我想创建一个索引,以便能够有效地执行以下操作:
select * from t where contains('%abc%');
而且:
select * from t where contains('abc%');
我也希望这个表能够实时更新。
如何创建这样的索引? (我有一种感觉,我需要一个ctxcat
索引,但我对我需要给它的选项感到困惑)
我正在使用Oracle 10g。
答案 0 :(得分:7)
我会使用它(设置最小和最大长度以适应值)
BEGIN
ctx_ddl.create_preference ('FT_WL', 'BASIC_WORDLIST');
ctx_ddl.set_attribute ('FT_WL', 'substring_index', 'YES');
ctx_ddl.set_attribute ('FT_WL', 'prefix_index', 'YES');
ctx_ddl.set_attribute ('FT_WL', 'prefix_min_length', 1);
ctx_ddl.set_attribute ('FT_WL', 'prefix_max_length', 6);
END;
CREATE INDEX fulltext_idx ON tmp_fulltext (fulltext)
INDEXTYPE IS CTXSYS.CTXCAT
PARAMETERS ('WORDLIST FT_WL')
这里解释了参数Oracle Text Reference
并查看有关如何管理刷新以及索引如何比使用高基数数据的完整扫描更快的问题:
答案 1 :(得分:1)
是的,您需要先创建一个环境,然后才能创建域索引。您需要拥有ctxsys
用户和必要的ctxapp
权限才能创建它。 Follow the steps explained in this link to have one for your environment。安装Oracle时,默认情况下不会创建此用户。
获得所有授权和包后,您可以创建首选项和索引,如图所示。
SQL> begin
2 ctx_ddl.create_preference('SUBSTRING_PREF', 'BASIC_WORDLIST');
3 ctx_ddl.set_attribute('SUBSTRING_PREF', 'SUBSTRING_INDEX','TRUE');
4 end;
5 /
现在创建一个域索引,如图所示。
SQL> create index test_idx on test(object_name)
2 indextype is ctxsys.context parameters ('wordlist SUBSTRING_PREF MEMORY 50M');
Index created.
select * from test where contains( object_name,'%EXEC%') > 0;
请参阅下面的链接,该链接通过执行计划对此进行了解释。 更新2018年:遗憾的是,原始链接已停止,并且未在archive.org上备份。
http://www.oraclebin.com/2012/12/oracle-text-and-domain-indexes.html
答案 2 :(得分:0)
如果您的数据库很大,请查看您的问题,然后您可以使用Sphinx Search
Sphinx是一个开源的全文搜索服务器,从头开始设计性能,相关性(又称搜索质量)和集成简单性。它是用C ++编写的,适用于Linux(RedHat,Ubuntu等),Windows,MacOS,Solaris,FreeBSD和其他一些系统
答案 3 :(得分:0)
只有在服务器上有intermedia / Oracle Text选项时,才能在Oracle中执行此操作...
对于您的示例,您可以使用
create index t_index_data on t(data)
indextype is ctxsys.context
parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');
我不确定您是否需要将类型从varchar2(100)
更改为clob
。
有关此类索引的详细信息和选项/示例,请参阅http://download.oracle.com/docs/cd/A91202_01/901_doc/text.901/a90122/ind4.htm