Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 博士后搜索策略_Sql_Postgresql_Search_Plpgsql - Fatal编程技术网

Sql 博士后搜索策略

Sql 博士后搜索策略,sql,postgresql,search,plpgsql,Sql,Postgresql,Search,Plpgsql,我的数据分为:- 邮政编码 城镇 放置 我的目标是构造一个搜索函数,该函数将按照优先顺序查找使用上述分段给出的任何文本。首先查找邮政编码,然后查找城镇,然后查找地点 在到达目的地之前,无需完全扫描邮政编码/城镇,这项工作能否高效完成?我可以确定文本是使用正则表达式的邮政编码,城镇和地点更难识别 我很高兴将其编码为PLPGSQL函数,并通过以下策略取得了一些进展:- WITH POSTCODES AS ( SELECT postcode FROM postcode WHERE pos

我的数据分为:-

  • 邮政编码
  • 城镇
  • 放置
我的目标是构造一个搜索函数,该函数将按照优先顺序查找使用上述分段给出的任何文本。首先查找邮政编码,然后查找城镇,然后查找地点

在到达目的地之前,无需完全扫描邮政编码/城镇,这项工作能否高效完成?我可以确定文本是使用正则表达式的邮政编码,城镇和地点更难识别

我很高兴将其编码为PLPGSQL函数,并通过以下策略取得了一些进展:-

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索引。如果你有兴趣,我可以提供一个完整的答案。