如何为'%abc%'搜索创建文本索引?

时间:2011-10-13 04:17:32

标签: sql oracle full-text-search indexing

我想索引像x like '%abc%'

这样的查询

如果我有如下表格

create table t
(
  data varchar(100)
);

我想创建一个索引,以便能够有效地执行以下操作:

select * from t where contains('%abc%');

而且:

select * from t where contains('abc%');

我也希望这个表能够实时更新。

如何创建这样的索引? (我有一种感觉,我需要一个ctxcat索引,但我对我需要给它的选项感到困惑)

我正在使用Oracle 10g。

4 个答案:

答案 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

并查看有关如何管理刷新以及索引如何比使用高基数数据的完整扫描更快的问题:

PL/SQL Performance Tuning for LIKE '%...%' Wildcard Queries

答案 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