2017-04-25 120 views
0

我有被分割成數據: -Postgres的搜索策略

  • 郵編
  • 地方

我的目標是建立一個搜索功能,將尋找任何文本按優先順序使用上述分段。即。首先尋找郵編,然後鎮然後地方

這可以有效地完成,而不必完全掃描郵政編碼/鎮之前獲得放置?我可以使用REGEX識別文本是郵編,城鎮和地點比較困難。

我很高興作爲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 
+0

你可以,如果你的索引與依據或杜松子酒索引這些字段使用索引。我建議使用較低($ 1)的較低(鎮),然後索引較低(鎮)..一定要使用ORDER BY或其他一些條款,以確保郵編匹配先來先,城鎮,接下來,然後地方或你可能會得到混亂的結果。忘了提及,索引時使用pg_trgm和gist/gin索引。如果你有興趣,我可以提供這個完整的答案。 –

回答

0

我解決了這個使用權重和我的數據合併到一個表中的列郵政編碼, 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'))