暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19c Orace文本索引 (CTXSYS.CONTEXT) -字符串搜索异常

ASKTOM 2020-03-03
2364

问题描述

我们有一个带有blob列的表,该表存储了各种文件 (如PDF,TIF,WORD等) 的blob,并且blob字段具有Oracle text index INDEXTYPE是CTXSYS.CONTEXT,以便我们能够在blob中搜索文本。我们看到使用CONTAINS的搜索查询给出了意想不到的结果。

以下是我们遵循的步骤:
1) 在blob字段上使用CTXSYS.CONTEXT索引创建表
2) 用一个OCR的blob (PDF) 填充表,并带有诸如 “executted”,“对应”,“purchase”,“original”,“marathon” 之类的单词,但没有单词 “w2”
3) 执行ctx_ddl.sync_index以同步索引。
4) 运行搜索查询。

搜索查询找不到PDF中的单词,但找到了PDF中没有的单词。为什么搜索结果会有所不同?

与Oracle Database 12c Enterprise Edition版本12.1.0.2.0-64bit生产中预期的工作原理相同。我已经比较了19和12.1.0.2之间的所有停止词,没有什么不同。

谢谢,

下面是脚本。
=
--- 表格脚本
CREATE TABLE OTXT_ORC_IMAGES_TGT_TEST4
(
  ISN                   NUMBER                  NOT NULL,
  DOCUMENT_BLOB         BLOB,
  DOCUMENT_BLOB_FORMAT  VARCHAR2(30 BYTE)
);

CREATE INDEX DOC_IMG_BLOB_TGT_TEST4 ON OTXT_ORC_IMAGES_TGT_TEST4
(DOCUMENT_BLOB)
INDEXTYPE IS CTXSYS.CONTEXT
PARAMETERS(' DATASTORE CTXSYS.DEFAULT_DATASTORE
FORMAT COLUMN DOCUMENT_BLOB_FORMAT
NOPOPULATE ');

CREATE UNIQUE INDEX PK_OTXT_ORC_IMAGES_TGT_TEST4 ON OTXT_ORC_IMAGES_TGT_TEST4
(ISN);

ALTER TABLE OTXT_ORC_IMAGES_TGT_TEST4 ADD (
  CONSTRAINT PK_OTXT_ORC_IMAGES_TGT_TEST4
  PRIMARY KEY
  (ISN)
  USING INDEX PK_OTXT_ORC_IMAGES_TGT_TEST4
  ENABLE VALIDATE);

=
-将BLOB插入表格
---- 我看不到在此处上传测试文件的选项
---- 请让我知道我该怎么做。
INSERT INTO OTXT_ORC_IMAGES_TGT_TEST4 
   (ISN, DOCUMENT_BLOB_FORMAT,DOCUMENT_BLOB)
 Values
   (29035, 'BINARY', '&BLOB');
COMMIT;

=

-- 指数优化
BEGIN
    ctx_ddl.sync_index ('DOC_IMG_BLOB_TGT_TEST4'
                       ,'500M'
                       ,NULL
                       ,4);
END;
/

=

-- 搜索查询
SELECT   COUNT (1)
  FROM   OTXT_ORC_IMAGES_TGT_TEST4 i;


计数 (1)
----------
1
选择1行。

-以下查询返回1,但文件没有单词 'w2'
SELECT   COUNT (1)
  FROM   OTXT_ORC_IMAGES_TGT_TEST4 i
WHERE   1 = 1 AND isn = 29035 AND CONTAINS (i.document_blob, 'w2') > 0;


计数 (1)
----------
1
选择1行。


-以下查询返回0,但文件具有所有搜索词
SELECT   COUNT (1)
 FROM   OTXT_ORC_IMAGES_TGT_TEST4 i
WHERE       1 = 1
         AND isn = 29035
         AND CONTAINS (
                 i.document_blob
                ,'marathon or executed or purchase or original or correspondence') >
    0;

 


计数 (1)
----------
0
选择1行。

============================================
03/04/2020上午6:15 CST:
根据要求,我已通过电子邮件发送测试文档以asktom_us@oracle.com主题 “问题9542416600346626815”
谢谢。

专家解答

您能否通过电子邮件将文档发送给asktom_us@oracle.com,主题为 “问题9542416600346626815”。

======================

谢谢你的文件。我无法重现您的脚本和文件的问题...

SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

1 row selected.

SQL> CREATE TABLE OTXT_ORC_IMAGES_TGT_TEST4
  2  (
  3    ISN                   NUMBER                  NOT NULL,
  4    DOCUMENT_BLOB         BLOB,
  5    DOCUMENT_BLOB_FORMAT  VARCHAR2(30 BYTE)
  6  );

Table created.

SQL>
SQL>
SQL> CREATE INDEX DOC_IMG_BLOB_TGT_TEST4 ON OTXT_ORC_IMAGES_TGT_TEST4
  2  (DOCUMENT_BLOB)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS(' DATASTORE CTXSYS.DEFAULT_DATASTORE
  5  FORMAT COLUMN DOCUMENT_BLOB_FORMAT NOPOPULATE');

Index created.

SQL>
SQL> CREATE UNIQUE INDEX PK_OTXT_ORC_IMAGES_TGT_TEST4 ON OTXT_ORC_IMAGES_TGT_TEST4
  2  (ISN);

Index created.

SQL>
SQL> ALTER TABLE OTXT_ORC_IMAGES_TGT_TEST4 ADD (
  2    CONSTRAINT PK_OTXT_ORC_IMAGES_TGT_TEST4
  3    PRIMARY KEY
  4    (ISN)
  5    USING INDEX PK_OTXT_ORC_IMAGES_TGT_TEST4
  6    ENABLE VALIDATE);

Table altered.

SQL>
SQL>
SQL> declare
  2    l_tgt_idx int := 1;
  3    l_src_idx int := 1;
  4    l_bf  bfile;
  5    l_blob   blob;
  6  begin
  7    insert into otxt_orc_images_tgt_test4
  8     (isn, document_blob_format,document_blob)
  9    values
 10     (29035, 'BINARY', empty_blob())
 11    returning document_blob into l_blob;
 12
 13    l_bf := bfilename('TEMP', '29035.pdf');
 14    dbms_lob.fileopen(l_bf, dbms_lob.file_readonly);
 15    dbms_lob.loadblobfromfile (
 16      dest_lob    => l_blob,
 17      src_bfile   => l_bf,
 18      amount      => dbms_lob.lobmaxsize,
 19      dest_offset => l_tgt_idx,
 20      src_offset  => l_src_idx);
 21    dbms_lob.fileclose(l_bf);
 22
 23    commit;
 24  end;
 25  /

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> BEGIN
  2      ctx_ddl.sync_index ('DOC_IMG_BLOB_TGT_TEST4'
  3                         ,'500M'
  4                         ,NULL
  5                         ,4);
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>
SQL>
SQL> SELECT   COUNT (1)
  2    FROM   OTXT_ORC_IMAGES_TGT_TEST4 i
  3  WHERE   1 = 1 AND isn = 29035 AND CONTAINS (i.document_blob, 'w2') > 0;

  COUNT(1)
----------
         0

1 row selected.

SQL>
SQL>
SQL> SELECT   COUNT (1)
  2   FROM   OTXT_ORC_IMAGES_TGT_TEST4 i
  3  WHERE       1 = 1
  4           AND isn = 29035
  5           AND CONTAINS (
  6                   i.document_blob
  7                  ,'marathon or executed or purchase or original or correspondence') > 0;

  COUNT(1)
----------
         1

1 row selected.

SQL>
SQL>


所以有几件事要检查

1) 确保正确加载斑点
2) 在索引创建上启用跟踪。请参阅下面的帖子

https://blogs.oracle.com/searchtech/oracle-text-indexes-new-logging-and-tracing-methods-in-12cr2

看看你能不能从那里得到什么。

希望这有所帮助。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论