Как придать вес полному совпадению по частичному совпадению (PostgreSQL) - PullRequest
3 голосов
/ 05 января 2011

У меня есть запрос, который принимает входные данные для поиска совпадения в zipcode / region / city / metrocode в таблице местоположений, содержащей несколько десятков тысяч записей (должно быть почти в каждом городе США).Я использую запрос:

select
  metrocode,
  region,
  postalcode,
  region_full,
  city
from
  dv_location
where
(
  region ilike '%Chicago%'
 or
  postalcode ilike '%Chicago%'
 or
  city ilike '%Chicago%'
 or
  region_full ilike'%Chicago%'
)

 and metrocode is not null

Странно, набор результатов, который я получаю, выглядит примерно так:

metrocode;region;postalcode;region_full;city
862;CA;95712;California;Chicago Park
862;CA;95712;California;Chicago Park
602;IL;60611;Illinois;Chicago
602;IL;60610;Illinois;Chicago

Что я делаю не так?Я думаю, что Чикаго будет иметь больший вес, чем Чикагский парк, так как Чикаго является точным соответствием с термином (даже при том, что я запрашиваю совпадение с подстановочным знаком в этом термине).

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Попробуйте это:

select
  metrocode,
  region,
  postalcode,
  region_full,
  city,
  (region = 'Chicago'
   OR postalcode = 'Chicago'
   OR city = 'Chicago'
   OR region_full = 'Chicago') AS full_match
from
  dv_location
where
(
  region ilike '%Chicago%'
 or
  postalcode ilike '%Chicago%'
 or
  city ilike '%Chicago%'
 or
  region_full ilike'%Chicago%'
)
 and metrocode is not null
 order by full_match desc;
2 голосов
/ 05 января 2011

Вы можете установить порядок в явном виде в порядке.

...
order by
case
  when city ilike 'Chicago' then 1
  when city ilike 'Chicago%' then 2
  when city ilike '%Chicago%' then 3
  else 4
end

или если вы хотите, чтобы ваши результаты были упорядочены ...

...