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

Oracle 如何在CONTAINS函数中转义保留字?

askTom 2017-03-13
373

问题描述

嗨,当我搜索到blob列时,我需要在contains函数中转义保留字。

让我们支持这个简单的表格:
CREATE TABLE MY_TABLE(
   MY_ID       NOT NULL, 
   MY_BLOB     BLOB NOT NULL,
   CONSTRAINT MY_BLOB CHECK(MY_BLOB IS JSON FORMAT JSON),
   CONSTRAINT "MY_ID" PRIMARY KEY ("MY_ID") 
);


我已经为blob列创建了一个索引:
CREATE INDEX "MY_BLOB_IDX" ON "MY_TABLE"
(
    "MY_BLOB"
)
INDEXTYPE IS "CTXSYS"."CONTEXT" PARAMETERS ('section group CTXSYS.JSON_SECTION_GROUP SYNC (ON COMMIT)');


然后我们插入三个记录
1, {"myField": "some text here"}
2, {"myField_1":"text here","myField_2":"other text here","myField_3":"something here"}
3, {"myField": "text here"}


因此,我需要在MY_TABLE的blob列中使用一个单词/一组字符 “某些” 进行部分搜索

我有这个查询,其中 “一些” 是一个保留字:

(1)
SELECT *
FROM MY_TABLE MT
WHERE CONTAINS(MY.MY_BLOB, '%some%', 1) > 0;


所以,我应该有ID 1和2的记录,因为两者都有一个单词或 “一些” 是东西的一部分。

根据特殊字符的文档 (https://docs.oracle.com/database/121/CCREF/cqspcl.htm#CCREF0400) 我需要使用 {大括号},因此我更改了查询:

(2)
SELECT *
FROM MY_TABLE MT
WHERE CONTAINS(MY.MY_BLOB, '%{some}%', 1) > 0;


所以,如果我想使用相同的查询 (1) 搜索 “文本”,我得到了一个结果,但是如果我搜索 “一些”,我没有得到使用查询 (1) 和 (2) 的任何结果。

你能帮我吗?

如果您需要更多信息,请告诉我。

谢谢

附言。我正在使用Oracle12c

专家解答

默认情况下,我们有 “停止列表”,即不会被索引的单词,因为它们被认为太常见而无法搜索。“一些” 是其中一个词。如果要包含这些单词,则可以创建自己的停止列表,该列表可以为空 (即,包含的所有内容) 或只是标准集的子集。例如

SQL> CREATE TABLE MY_TABLE(
  2     MY_ID       int NOT NULL,
  3     MY_BLOB     CLOB NOT NULL,
  4     CONSTRAINT MY_BLOB CHECK(MY_BLOB IS JSON FORMAT JSON),
  5     CONSTRAINT MY_ID PRIMARY KEY (MY_ID)
  6  );

Table created.

SQL> CREATE INDEX MY_BLOB_IDX ON MY_TABLE
  2  (
  3      MY_BLOB
  4  )
  5  INDEXTYPE IS CTXSYS.CONTEXT;

Index created.

SQL> insert into my_table values (1, '{"myField": "some text here"}');

1 row created.

SQL> insert into my_table values (2, '{"myField_1":"text here","myField_2":"other text here","myField_3":"something here"}');

1 row created.

SQL> insert into my_table values (3, '{"myField": "text here"}');

1 row created.

SQL> SELECT *
  2  FROM MY_TABLE MT
  3  WHERE CONTAINS(MT.MY_BLOB, '%some%', 1) > 0;

SQL> exec ctx_ddl.create_stoplist('keep_all_stopwords', 'BASIC_STOPLIST');

PL/SQL procedure successfully completed.

SQL> drop index MY_BLOB_IDX;

Index dropped.

SQL>
SQL> CREATE INDEX MY_BLOB_IDX ON MY_TABLE
  2  ( MY_BLOB) INDEXTYPE IS CTXSYS.CONTEXT
  3  PARAMETERS ('stoplist keep_all_stopwords SYNC (ON COMMIT)');

Index created.

SQL> SELECT *
  2  FROM MY_TABLE MT
  3  WHERE CONTAINS(MT.MY_BLOB, '%some%', 1) > 0;

     MY_ID MY_BLOB
---------- --------------------------------------------------------------------------------
         1 {"myField": "some text here"}
         2 {"myField_1":"text here","myField_2":"other text here","myField_3":"something he

2 rows selected.

SQL>


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论