Oracle: Полный текстовый поиск с условием

Я создал текстовый индекс Oracle, как следующее:

create index my_idx on my_table (text) indextype is ctxsys.context; 

, и я могу сделать следующее:

select * from my_table where contains(text, '%blah%') > 0;

, но позволяет сказать У нас есть другой столбец в этой таблице, скажем group_id , и я хотел сделать вместо следующего запроса:

select * from my_table where contains(text, '%blah%') > 0 and group_id = 43;

с вышеуказанным индексом, Oracle придется искать все элементы, которые содержат «BLAH» , а затем проверьте все их group_id .

В идеале я бы предпочел найти только предметы с Group_id = 43 , так что я d Хотите такой индекс:

create index my_idx on my_table (group_id, text) indextype is ctxsys.context; 

Вид как нормальный индекс, поэтому отдельный текстовый поиск может быть сделан для каждого group_id .

Есть ли способ сделать что-то вроде этого в Oracle ( Я использую 10G, если это важно)?

Редактирование (разъяснение)

Рассмотрим таблицу с одним миллионом строк и следующие два столбца среди прочего, A и B , оба числовые. Позволяет сказать, что есть 500 разных Аренда ценностей A и 2000 различных значений b , и каждая строка уникальна.

Теперь давайте рассмотрим Выбрать ... где a = x и b = y

индекс на A и b в отдельности, насколько я могу сказать Поиск индекса на B , который вернет 500 разных строк, а затем выполните соединение / сканирование на этих строках. В любом случае, по крайней мере, 500 строк должны быть рассмотрены (кроме базы данных, которые повезло и нахожу необходимую строку рано.

, тогда как индекс (A, B) гораздо более эффективен, Он находит один ряд в одном поисковом индексе.

Положить отдельные индексы на group_id и текст, который я чувствую, только оставляет генератор запроса с двумя вариантами.

(1) Используйте GROUP_ID Индекс и сканируйте все результирующие строки для текста.
(2) Используйте текстовый индекс и сканируйте все результирующие строки для group_id .
(3) Используйте как индексы, и выполните соединение.

Принимая во внимание, что я хочу:

(4) Используйте индекс (GROUP_ID, «TEXT») , чтобы найти текстовый индекс под конкретным GROUP_ID и отсканировать этот текстовый индекс для конкретный ряд / строки, которые мне нужны. Нет сканирования и проверки или присоединения не требуется, как при использовании индекса (A, B) .

11
задан Clinton 11 September 2011 в 22:51
поделиться