我正在尝试创建一个索引,该索引的一个字段包含来自 postgresql 中其他几个字段的串联结果。
例如我有一个地址:
BLACKPOOL FYLDE & WYRE SOCIETY FOR THE BLIND, PRINCESS ALEXANDRA HOME FOR THE BLIND, BOSWORTH PLACE, BLACKPOOL, FY4 1SH
以上由 5 个字段组成,示例中以逗号分隔。我想创建一个包含来自 5 个字段的数据的索引字段。
我希望我的索引包含 3 个字段:uprn、AddressText、wkb_geometry AddressText 将包含上面的示例,其中有 5 个字段串联在一起,其他 2 个字段只是常规字段。
我知道如何在查询中连接“||”并且工作正常但找不到任何地方可以解释如何执行上述操作。我所描述的方式是地址数据提供者 (Ordnance Survey) 解释的方式,但他们没有提供创建索引的示例代码。
我可以用上面的方法创建一个新表,但是本地址数据更新时必须重新创建它。
我用来构建地址的实际查询是这样的,因为您可以看到它比 5 个字段更复杂:
SELECT uprn,
(
CASE WHEN organisation_name IS NOT NULL THEN organisation_name || ', ' ELSE '' END
|| CASE WHEN sao_text IS NOT NULL THEN sao_text || ', ' ELSE '' END
|| CASE WHEN sao_start_number IS NOT NULL THEN sao_start_number::text ELSE '' END
|| CASE WHEN sao_start_suffix IS NOT NULL THEN sao_start_suffix ELSE '' END
|| CASE WHEN sao_end_number IS NOT NULL THEN '-' || sao_end_number ELSE '' END
|| CASE WHEN sao_end_suffix IS NOT NULL THEN sao_end_suffix ELSE '' END
|| CASE WHEN sao_start_number IS NOT NULL THEN ' ' ELSE '' END
|| CASE WHEN pao_text IS NOT NULL THEN pao_text || ', ' ELSE '' END
|| CASE WHEN pao_start_number IS NOT NULL THEN pao_start_number::text ELSE '' END
|| CASE WHEN pao_start_suffix IS NOT NULL THEN pao_start_suffix ELSE '' END
|| CASE WHEN pao_end_number IS NOT NULL THEN '-' || pao_end_number ELSE '' END
|| CASE WHEN pao_end_suffix IS NOT NULL THEN pao_end_suffix ELSE '' END
|| CASE WHEN pao_start_number IS NOT NULL THEN ' ' ELSE '' END
|| CASE WHEN street_description IS NOT NULL THEN street_description || ', ' ELSE '' END
|| CASE WHEN locality IS NOT NULL THEN locality || ', ' ELSE '' END
|| CASE WHEN town_name IS NOT NULL THEN town_name ELSE '' END
|| CASE WHEN administrative_area <> town_name THEN ', ' || administrative_area ELSE '' END
|| CASE WHEN postcode_locator IS NOT NULL THEN ', ' || postcode_locator ELSE '' END
) AS AddressText, wkb_geometry
FROM addressbase.address
LIMIT 1000
不幸的是我不能这样做:
CREATE INDEX AddressSearchIndex ON addressbase.address (uprn,
(
CASE WHEN organisation_name IS NOT NULL THEN organisation_name || ', ' ELSE '' END
|| CASE WHEN sao_text IS NOT NULL THEN sao_text || ', ' ELSE '' END
|| CASE WHEN sao_start_number IS NOT NULL THEN sao_start_number::text ELSE '' END
|| CASE WHEN sao_start_suffix IS NOT NULL THEN sao_start_suffix ELSE '' END
|| CASE WHEN sao_end_number IS NOT NULL THEN '-' || sao_end_number ELSE '' END
|| CASE WHEN sao_end_suffix IS NOT NULL THEN sao_end_suffix ELSE '' END
|| CASE WHEN sao_start_number IS NOT NULL THEN ' ' ELSE '' END
|| CASE WHEN pao_text IS NOT NULL THEN pao_text || ', ' ELSE '' END
|| CASE WHEN pao_start_number IS NOT NULL THEN pao_start_number::text ELSE '' END
|| CASE WHEN pao_start_suffix IS NOT NULL THEN pao_start_suffix ELSE '' END
|| CASE WHEN pao_end_number IS NOT NULL THEN '-' || pao_end_number ELSE '' END
|| CASE WHEN pao_end_suffix IS NOT NULL THEN pao_end_suffix ELSE '' END
|| CASE WHEN pao_start_number IS NOT NULL THEN ' ' ELSE '' END
|| CASE WHEN street_description IS NOT NULL THEN street_description || ', ' ELSE '' END
|| CASE WHEN locality IS NOT NULL THEN locality || ', ' ELSE '' END
|| CASE WHEN town_name IS NOT NULL THEN town_name ELSE '' END
|| CASE WHEN administrative_area <> town_name THEN ', ' || administrative_area ELSE '' END
|| CASE WHEN postcode_locator IS NOT NULL THEN ', ' || postcode_locator ELSE '' END
) AS AddressText, wkb_geometry);
然后该示例将允许我进行如下搜索:
SELECT UPRN, AddressText, wkb_geometry FROM AddressSearchIndex
WHERE
AddressText LIKE ‘%4%’ AND
AddressText LIKE ‘%HIGH%’ AND
AddressText LIKE ‘%STREET%’ AND
AddressText LIKE ‘%WESTVILLE%’ AND
AddressText LIKE ‘%WV17%’;
最佳答案
使用在Postgres 全文搜索
或Postgres 官方手册上可以在互联网上找到的信息:http://www.postgresql.org/docs/current/static/textsearch.html
据我所知,您将需要:
1) 表达式上的 GIN 或 GIST 索引(参见全文搜索示例)。
2) 在基表 + 您的表达式上创建一个简单的 VIEW(不是 MVIEW)。
3) 对您的 VIEW 使用全文搜索查询。
关于postgresql - 创建和索引包含连接的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26121996/