【问题标题】:Index multiple columns of the same table for Context Full-Text Search?为上下文全文搜索索引同一个表的多个列?
【发布时间】:2017-05-17 15:15:22
【问题描述】:

我有一个包含 3 列的表,需要通过 Oracle APEX 应用程序启用全文搜索。如何为所有三列创建索引以便可以搜索它们?

目前我在一列 (STOP_NAME) 上有上下文索引:

DECLARE

  l_query VARCHAR2(4000);

BEGIN

  l_query:= 
   'select 
    "BUS_STOP_ID",
    "STOP_NAME",
    "DESC_NOTES",
    "BUS_NUMBERS",
    "LOCATION"
    from   "BUS_STOPS" ';

  IF v('P2_REPORT_SEARCH') IS NOT NULL THEN
    l_query := l_query||' '||'
    where 
    (   
     CONTAINS(STOP_NAME, ''$'|| v('P2_REPORT_SEARCH') ||''') > 0
    )
   ';
  END IF;

  RETURN l_query;

END;

但是如何创建一个使用三列(stop_name、desc_notes、bus_numbers)进行文本搜索的索引?我尝试使用 3 列创建标准索引,但它不起作用:

CREATE INDEX bus_stops_ctx_idx
ON bus_stops (stop_name, bus_numbers, desc_notes)
INDEXTYPE IS ctxsys.context;

【问题讨论】:

  • SQL 注入警报!试试这个:CONTAINS(STOP_NAME, ''$''|| :P2_REPORT_SEARCH) > 0
  • 您能否解释一下这如何防止 sql 注入以及 $ 如何不阻止返回值。

标签: oracle oracle-sqldeveloper oracle-apex


【解决方案1】:

第一步是创建索引首选项:

BEGIN
ctx_ddl.create_preference('my_multi_idx', 'MULTI_COLUMN_DATASTORE');
ctx_ddl.set_attribute('my_multi_idx', 'COLUMNS', 'stop_name, desc_notes, bus_numbers');
END;

然后使用先前设置的首选项创建索引本身:

CREATE INDEX bus_stops_ctx_idx
ON bus_stops(stop_name)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS ('DATASTORE my_multi_idx SYNC ( ON COMMIT )');

【讨论】:

  • 当我尝试这个时,我的查询从我的第二列返回行,但不是我的第一列,即使第一列是 contains 的第一个参数
  • select * from xxpeople where contains(first_name, 'lin AND merwe') > 0 order by first_name, last_name;
  • 奇怪的是,没有 AND 它确实在第一列上搜索。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 2014-02-12
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多