问题描述
嗨,当我搜索到blob列时,我需要在contains函数中转义保留字。
让我们支持这个简单的表格:
我已经为blob列创建了一个索引:
然后我们插入三个记录
因此,我需要在MY_TABLE的blob列中使用一个单词/一组字符 “某些” 进行部分搜索
我有这个查询,其中 “一些” 是一个保留字:
(1)
所以,我应该有ID 1和2的记录,因为两者都有一个单词或 “一些” 是东西的一部分。
根据特殊字符的文档 (https://docs.oracle.com/database/121/CCREF/cqspcl.htm#CCREF0400) 我需要使用 {大括号},因此我更改了查询:
(2)
所以,如果我想使用相同的查询 (1) 搜索 “文本”,我得到了一个结果,但是如果我搜索 “一些”,我没有得到使用查询 (1) 和 (2) 的任何结果。
你能帮我吗?
如果您需要更多信息,请告诉我。
谢谢
附言。我正在使用Oracle12c
让我们支持这个简单的表格:
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




