1

SOME_NUMERIC_PARAM我需要一个带有文本字段的大表:

CREATE TABLE HR.IOT_TEST
(
  ID VARCHAR2(30 CHAR),
  SOME_NUMERIC_PARAM NUMBER,
  TEXTS CLOB,
  CONSTRAINT PK_IOT PRIMARY KEY (ID, SOME_NUMERIC_PARAM) ENABLE
)
ORGANIZATION INDEX;

我想在那个 CLOB 上建立一个文本搜索索引:

CREATE INDEX IOT_TEST_IND ON HR.IOT_TEST
(
  TEXTS
)
INDEXTYPE IS CTXSYS.CONTEXT; 

但我得到这个错误:

Table HR.IOT_TEST created.

SQL Error: ORA-29958: fatal error occurred in the execution of ODCIINDEXCREATE routine
ORA-29960: line 1, 
DRG-11303: secondary indexes are not supported by this indextype

我错过了什么?如何使用 Oracle 文本和索引组织表?

4

1 回答 1

2

“如何使用 Oracle 文本和索引组织表”

你不能。索引组织的表基本上只是一个索引(有一个表对象,但它是存根)。我们不能在索引上建立索引,这只是数据库架构的限制。

但是你为什么要这样做呢?用 . 构建这张表没有任何价值organization index。物联网的用例有限;它们主要用于参考数据查找之类的事情,它通常具有键含义结构:我们总是通过键查找描述,没有其他访问路径,我们通常在 SQL 中使用这两个列。

任何带有 CLOB 的索引似乎都不适合该类用例。您想要独立搜索文本的事实证实了这一点。您需要为您的 CLOB 构建一个常规堆表。然后你可以建立一个文本索引。

我猜你想将全文搜索与其他过滤器结合起来。如果是这样,您应该检查 CTXCAT 索引类型。这是一种不同类型的文本索引,它允许我们构建常规列和启用自由文本搜索的列的复合索引。因此,您可以运行一个查询来查找包含单词“bicycle”的 TEXTS 值,其中数字值大于某个值,如下所示:

select from hr.txt_test 
where CATSEARCH(texts, 'bicycle', 'some_numeric_param > 23')> 0; 

CTXCAT 索引的另一个优点是它们是事务性的,因此我们不必使用后台作业来维护它们。主要缺点是它们并不真正适合大块文本。所以也许他们不适合你的情况。了解更多


“我需要一个由 SOME_NUMERIC_PARAM 订购的带有文本字段的大表”

我想你排除了分区(因为许可?)。当您使用 12c 时,属性聚类可能会为您提供帮助。这是“一个表级指令,它根据某些列的内容在物理上非常接近地聚集数据”(来自文档)。但是,属性聚类仅在通过直接路径插入操作、数据移动或表创建填充表时起作用:普通 DML 语句不应用它。


“又有点像 ebay 风格,人们从一些非常常见的东西开始,比如samsung很少有排序选项”

因此,像 eBay、Google 和许多其他可扩展性图腾这样的网站的问题在于,它们在缓存、索引和专门的数据结构上投入了大量精力。在许多方面,它们就像数据仓库,具有高度非规范化的数据结构。因此,许多 eBay 搜索过滤结果不是来自对项目描述的全文搜索,而是通过过滤和匹配类似结构的维度:最初甚至不是数据库表,而是内存中的缓存。

常见的搜索模式是缓存并以下拉建议的形式呈现。他们甚至以这种方式处理错别字。在 eBay 搜索框中smasu输入内容,您将获得与输入内容相同的建议搜索内容,samsu即当前理想的三星手机列表(而不是笔记本电脑或冰箱)。那是定制的。开箱即用的 Oracle Text 无法做到这一点。

所以它又回到了,你真的想成为 eBay 的样子吗?使用这些网站作为功能的简写很容易,实现等效功能是一项不同的任务。

于 2017-05-07T06:52:23.980 回答