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
postgresql-创建包含连接字段的索引_Postgresql - Fatal编程技术网

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

postgresql-创建包含连接字段的索引,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、Ad

我试图创建一个索引,该索引包含一个字段,该字段包含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_几何体 AddressText将包含上面的示例,其中5个字段连接到其中,其他2个字段只是常规字段

我知道如何在查询中连接“| |”,这很好,但找不到任何地方解释如何执行上述操作。我所描述的方式是地址数据提供者(ArmonthSurvey)如何解释应该如何做,但他们没有给出创建索引的示例代码

我可以用上面的内容创建一个新表,但在更新地址数据时必须重新创建它

我将用于构建地址的实际查询如下所示,因为您可以看到它比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

使用互联网上
Postgres全文搜索
或Postgres官方手册中的信息:

如我所见,您将需要:

1) 表达式上的GIN或GIST索引(请参见全文搜索示例)

2) 在基表+表达式上创建一个简单视图(不是MVIEW)


3) 在视图中使用全文搜索查询。

BTW
CASE当sao_text不为空时,sao_text | | |',“ELSE”END
给出的结果与
coalesce(sao_text | |','')相同。
我认为示例搜索并没有那么好。我的互联网搜索似乎抛出了许多使用TSVECTOR的全文搜索的例子,但由于数据提供商的官方例子有不同的说法,我对此感到厌烦。这些示例是通用SQL,但并不特定于postgresql。非常感谢您的帮助。我想您正在搜索PostgreSQL 9.3@pozs中添加的
物化视图
功能。这种情况下,MVIEW中没有必要使用该功能。一个简单的函数索引或一个列+触发器就可以了。@IgorRomanchenko谢谢,coalesce更容易阅读。
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%’;