Я пытаюсь создать функцию поиска, ища содержимое BLOB в таблице. Я использовал эту ссылку в качестве основы: https://oracle-base.com/articles/9i/full-text-indexing-using-oracle-text-9i
У меня есть следующая таблица с несколькими строками с BLOB внутри:
SQL> desc dm_document
Name Null? Type
----------------------------------------- -------- ----------------------------
DOCUMENT_NO VARCHAR2(100)
DOCUMENT_TYPE VARCHAR2(100)
DOCUMENT BLOB
FILENAME VARCHAR2(255)
MIMETYPE VARCHAR2(100)
LAST_UPDATE_DATE DATE
HOSTNAME VARCHAR2(255)
URL VARCHAR2(255)
FOLDER_NAME VARCHAR2(255)
FOLDER VARCHAR2(10)
CATEGORYID VARCHAR2(10)
SUBCATEGORYID VARCHAR2(10)
VERSIONID VARCHAR2(10)
APPROVALID VARCHAR2(10)
UPLOAD_TYPE VARCHAR2(50)
Что я сделал:
- создал индекс типа CONTEXT
CREATE INDEX dm_document_idx ON DM_DOCUMENT(DOCUMENT) INDEXTYPE IS CTXSYS.CONTEXT;
- После этого я запрашиваю таблицу, используя простой поиск, например:
SELECT
SCORE(1) score,
DOCUMENT_NO,
DOCUMENT_TYPE,
FILENAME,
MIMETYPE
FROM DM_DOCUMENT
WHERE CONTAINS(DOCUMENT, 'dokumen', 1) > 0
ORDER BY SCORE(1) DESC;
Что работает, и я интегрировал это в свое приложение Oracle APEX.
Однако функциональность поиска довольно строгая и требует точных слов и предложений. Я предполагаю, что пользователи хотели бы быть более снисходительными к словам, которые они ищут. Чтобы найти решение, я искал нечеткие поиски, и мой поиск приводит к следующим ссылкам:
https://docs.oracle.com/cd/B13789_01/text.101/b10730/cqoper.htm
Что побудило меня попробовать следующий запрос:
SQL> SELECT
2 SCORE(1) score,
3 DOCUMENT_NO,
4 DOCUMENT_TYPE,
5 FILENAME,
6 MIMETYPE
7 FROM DM_DOCUMENT
8 WHERE CONTAINS(DOCUMENT, 'fuzzy(dokumen inii, 70, 6, weight)', 1) > 0
9 ORDER BY SCORE(1) DESC;
SELECT
*
ERROR at line 1:
ORA-29902: error in executing ODCIIndexStart() routine
ORA-20000: Oracle Text error:
DRG-50901: text query parser syntax error on line 1, column 15
Я знаю, что мог подойти к этому неправильно, поскольку нечеткая функция, похоже, работает с текстовыми столбцами, а не с BLOB. Есть ли правильный способ сделать это (или другие подходы)?
Заранее спасибо.
fuzzy
принимает только ОДНО СЛОВО в качестве первого аргумента - без пробелов. см. аналогичный вопрос для более подробного ответа. - person kfinity   schedule 08.03.2021