postgresql - 创建和索引包含连接的字段

标签 postgresql

我正在尝试创建一个索引,该索引的一个字段包含来自 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/

相关文章:

sql - 无法在 phpPgAdmin 中创建表

postgresql - 在 Rails 中对库存进行分组和计数

sql - 更改 PostgreSQL 中时间戳的一部分(不是相对)

sql - 为每 5 个唯一列选择前 10 行

postgresql - 如何访问 pgadmin 数据库设计器?

PostgreSQL - 从命令行将 SQL 文件读入 PostgreSQL 数据库

sql - 鉴于此模式设计,我如何选择每个主题的最高帖子并将它们关联起来?

java - PostgreSQL JDBCPreparedStatement的setBytes更改参数值

SQL根据字符串模式将单列转换为多行

Postgresql like into if 子句