Sql 博士后搜索策略
我的数据分为:-Sql 博士后搜索策略,sql,postgresql,search,plpgsql,Sql,Postgresql,Search,Plpgsql,我的数据分为:- 邮政编码 城镇 放置 我的目标是构造一个搜索函数,该函数将按照优先顺序查找使用上述分段给出的任何文本。首先查找邮政编码,然后查找城镇,然后查找地点 在到达目的地之前,无需完全扫描邮政编码/城镇,这项工作能否高效完成?我可以确定文本是使用正则表达式的邮政编码,城镇和地点更难识别 我很高兴将其编码为PLPGSQL函数,并通过以下策略取得了一些进展:- WITH POSTCODES AS ( SELECT postcode FROM postcode WHERE pos
- 邮政编码
- 城镇
- 放置
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 PLACES
我使用权重法解决了这个问题,并将我的数据合并到一个表中,表中有POSTCODE、TOWN和PLACE列,我的数据允许我这样做 然后,我可以创建一个附加列tsv,如下所示:-
setweight(to_tsvector(COALESCE(postcode,'')), 'A') ||
setweight(to_tsvector(COALESCE(town,'')) , 'B') ||
setweight(to_tsvector(COALESCE(place,'')) , 'C')
并使用以下内容进行搜索:-
WHERE (tsv @@ plainto_tsquery('SN1 3PF'))
如果使用gist或gin索引对这些字段进行索引,则可以使用索引。我建议使用lower(town)like lower($1),然后索引lower(town)。。一定要使用ORDERBY或其他一些子句来确保邮政编码匹配,先是城镇,然后是地点,否则可能会得到混乱的结果。忘了提到,在索引时,使用pg_trgm和gist/gin索引。如果你有兴趣,我可以提供一个完整的答案。