Поиск столбца со значениями, разделенными запятыми, в Oracle

Я использую Oracle 11g и Oracle Text для поисковой системы.

Теперь я создал и проиндексировал текстовый столбец CLOB Keywords, который содержит слова, разделенные пробелами. Это позволило мне расширить поиск, поскольку Oracle Text будет возвращать строки, содержащие одно или несколько ключевых слов, хранящихся в этом столбце. Содержимое столбца скрыто от пользователя и используется только для «расширения» поиска. Это работает по назначению.

Но теперь мне нужно поддерживать несколько слов или даже целых предложений. При текущей конфигурации Oracle Text будет искать только отдельные ключевые слова. Как мне сохранить фразы и настроить Oracle Text так, чтобы он искал фразы целиком (точное совпадение предпочтительнее, но нечеткое совпадение тоже подойдет)?

Пример содержимого столбца из двух строк (значения, разделенные точкой с запятой):

"hello, hello; is there anybody out there?; nope;"
"just the; basic facts;"

Я нашел аналогичный вопрос: Поиск в столбце со значениями, разделенными запятыми, за исключением того, что мне нужно решение для Oracle 11g с функцией поиска свободного текста.

Возможные решения:

1-е решение: я думал о перепроектировании БД следующим образом. Я бы сделал новую таблицу Keywords(pkID NUMBER, nonUniqueID NUMBER, singlePhrase VARCHAR2(100 BYTE)). И я бы изменил предыдущий столбец Keyword на KeywordNonUniqueID, который будет содержать идентификатор (вместо списка значений). Во время поиска я бы INNER JOIN с новой таблицей Keyword. Проблема с этим решением заключается в том, что я получу несколько строк, содержащих одни и те же данные, кроме фразы. Я предполагаю, что это разрушит рейтинг?

2-е решение: возможно ли хранить фразы в виде XML в исходном столбце Keyword и каким-то образом указывать Oracle Text для поиска в XML?

3-е решение:?

Обратите внимание, что, как правило, фраз не будет много (менее 100) и они не будут длинными (в одной фразе может быть до 5 слов).

Также обратите внимание, что в настоящее время я использую CONTAINS и несколько его операторов для полнотекстового поиска.

EDIT: это https://forums.oracle.com/forums/thread.jspa?messageID=10791361 обсуждение, которое почти решает мою проблему, но оно также соответствует отдельным словам, а не всей фразе (точное соответствие).


person Howie    schedule 09.01.2013    source источник


Ответы (1)


Oracle по умолчанию поддерживает поиск фраз. В документах мы можем увидеть это

4.1.4.1 СОДЕРЖИТ фразовые запросы

Если в выражении запроса содержится несколько слов, разделенных только пробелами (без операторов), строка слов считается фразой, и Oracle Text ищет всю строку во время запроса.

Например, чтобы найти все документы, содержащие фразу международное право, введите запрос с фразой международное право.

Я ответил на ваш вопрос или неправильно вас понял?

P.S. Мне кажется, что решение конвертировать

"привет, привет, там есть кто-нибудь?; нет;" "просто основные факты"

to

"привет, привет аа есть кто-нибудь там? аа нет аа" "просто аа основные факты аа"

и выполните поиск с помощью CONTAINS по фразе «Есть ли там кто-нибудь? аа»

person knagaev    schedule 17.01.2013
comment
Это не то, что мне нравится (хотя это решение может дать достаточно хорошие результаты для моих нужд), потому что оно также найдет документы, содержащие фразу: международное право и суд, потому что фраза «международное право» содержится в этом документе. Я хочу, чтобы Oracle DB возвращала документы, которые точно соответствуют фразе/строке или вообще не соответствуют. - person Howie; 17.01.2013
comment
Может быть, вы можете использовать строки поиска с разделителями. То есть используйте фразу международное право; и это не будет соответствовать тексту международного права и суда. Если Oracle Text не включает точки с запятой в слова, мы можем добавлять немые символы в конец фраз. Например, текст международного права и международного права и суда будет отличаться. Только одно замечание: вам нужно проверить наличие слова с немым символом. То есть, если мы выберем a в качестве немого символа и будем искать фразу, оканчивающуюся на слово abac, мы можем получить неправильные совпадения со словом abaca. Редкий случай, но мы можем добавить aa :) - person knagaev; 17.01.2013