Oracle текстовый поиск диапазонов - PullRequest
0 голосов
/ 29 июля 2010

Я ищу лучший способ поиска по числовым диапазонам в Oracle Text. У меня есть приложение БД, которое выполняет много вещей типа ГИС, но теперь мы хотим добавить поиск по диапазону улиц.

Так что я бы хотел сохранить минимальное и максимальное значения в столбце и искать число в этих значениях. Я рад изучить варианты, но мне хотелось бы получить несколько советов о том, куда идти. У кого-нибудь есть предложения для меня?

РЕДАКТИРОВАТЬ: мы просто пытаемся сделать поиск адресов проще. Текст на адресных частях имел огромный успех, но мы хотим хранить диапазоны улиц вместо каждого отдельного номера дома. Таким образом, если бы я искал "11 high street", я бы ожидал совпадения, если бы у high street был диапазон от 1 до 1000. Мне также хотелось бы некоторые варианты, которые я мог бы использовать, если я искал "flat 1 11 high street "Хотя тоже. Я ожидаю, что в этих случаях мне придется немного поиграть с входными данными, я просто хочу знать, с какими инструментами я мог бы попытаться поработать.

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Я предлагаю создать строковое поле стандартной длины для хранения номеров зданий, создать индекс для этого поля и затем использовать between для поиска.

Примерно такой формат:

NNNNNNCCCCBBBB

где:

NNNNNN - номер дома с левой стороны;
CCCC - символ с левой стороны (как 'A' в '11A');
BBBB - слева-номер здания с мягкой подкладкой

Под «левой подкладкой» я подразумеваю «заполненный символом стандартной длины с левой стороны», см., например, результат запроса select lpad('11',5,'X') from dual;.

Например, предположим, у вас есть адрес "11A high street building 5" и выберите "%" в качестве символа заполнения.При преобразовании в предложенный формат это выглядит как '%%%11%%%A%%%' и «главная улица», хранящаяся в отдельных полях.Далее приведен пример запроса для выбора всех домов от 1 до 1000:

with address_list as (
  select '%%%11%%%A%%%%' bnum from dual union all
  select '%1001%%%A%%%%' bnum from dual union all
  select '%%%%1%%%A%%%%' bnum from dual union all
  select '%%%%1%%%%%%%%' bnum from dual union all
  select '%%321%%%A%%%%' bnum from dual union all
  select '%1000%%%A%%%%' bnum from dual union all
  select '%1000%%QQ%%12' bnum from dual 
)
select * from address_list
where 
  -- from '1 high street'
  bnum >= '%%%%1%%%%%%%%' 
  and                    
  -- less then '1001 high street'            
  bnum < '%1001%%%%%%%%' 
order by 
  bnum

В реальном случае лучше использовать chr(1) или любой другой непечатаемый символ в качестве символа для заполнения.

Другая вещьзаключается в создании только функционального индекса для поиска без реального хранения полей.

2 голосов
/ 30 июля 2010

Что-то не так с

WHERE <number> BETWEEN minColumn AND maxColumn
...