Tengo datos que están segmentados en: -
Mi objetivo es construir una función de búsqueda que busque cualquier texto dado utilizando las segmentaciones anteriores en orden de precedencia. es decir. Primero busque el código postal, luego la ciudad y luego el lugar
¿Se puede hacer esto de manera eficiente sin tener que escanear por completo el código postal/ciudad antes de llegar al lugar? Puedo identificar que el texto es un código postal usando REGEX, la ciudad y el lugar son más difíciles.
Estoy feliz de codificar esto como una función PLPGSQL y progresé con una estrategia en este sentido:
WITH POSTCODES AS ( SELECT postcode FROM postcode WHERE postcode ~* $1 ), TOWNS AS ( SELECT town FROM towns WHERE (SELECT * FROM POSTCODES LIMIT 1) IS NULL AND town ~* $1 ), PLACES AS ( SELECT place FROM places WHERE (SELECT * FROM TOWNS LIMIT 1) IS NULL AND place ~* $1 ) SELECT postcode as res FROM POSTCODE UNION ALL SELECT town as res FROM TOWNS UNION ALL SELECT place as res FROM PLACESResolví esto usando ponderaciones y combinando mis datos en una sola tabla con columnas CÓDIGO POSTAL, CIUDAD, LUGAR que mis datos me permiten hacer.
Luego puedo crear una columna adicional tsv como: -
setweight(to_tsvector(COALESCE(postcode,'')), 'A') || setweight(to_tsvector(COALESCE(town,'')) , 'B') || setweight(to_tsvector(COALESCE(place,'')) , 'C')Y busca con:-
WHERE (tsv @@ plainto_tsquery('SN1 3PF'))