# 12.2.表和索引
上一节中的示例演示了使用简单常量字符串的全文匹配。本节介绍如何搜索表数据,可以选择使用索引。
# 12.2.1.搜索桌子
可以在没有索引的情况下进行全文搜索。一个简单的查询来打印标题
包含单词的每一行的朋友
在它的身体
字段是:
SELECT title
FROM pgweb
WHERE to_tsvector('english', body) @@ to_tsquery('english', 'friend');
这也会找到相关的词,比如朋友
和友爱的
,因为所有这些都被简化为相同的规范化词素。
上面的查询指定英语
配置用于解析和规范化字符串。或者,我们可以省略配置参数:
SELECT title
FROM pgweb
WHERE to_tsvector(body) @@ to_tsquery('friend');
此查询将使用由设置的配置违约_文本_搜索_配置.
一个更复杂的例子是选择包含创造
和桌子
在标题
或身体
:
SELECT title
FROM pgweb
WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC
LIMIT 10;
为了清楚起见,我们省略了合并
查找包含无效的
在这两个领域之一。
虽然这些查询在没有索引的情况下可以工作,但大多数应用程序会发现这种方法太慢,除了偶尔的临时搜索。文本搜索的实际应用通常需要创建索引。
# 12.2.2.创建索引
我们可以创建一个索引(第12.9节)要加快文本搜索速度,请执行以下操作:
CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', body));
请注意,的2参数版本到_tsvector
被使用了。表达式索引中只能使用指定配置名称的文本搜索函数(第11.7节)。这是因为索引内容必须不受违约_文本_搜索_配置。如果受影响,索引内容可能不一致,因为不同的条目可能包含tsvector
使用不同的文本搜索配置创建的,无法猜测哪个是哪个。要正确地转储和恢复这样的索引是不可能的。
因为两个参数的版本到_tsvector
在上面的索引中使用了,只是一个使用2参数版本的查询引用到_tsvector
具有相同配置名称的用户将使用该索引。就是,去哪里“a&b”
可以使用索引,但是去哪里_tsvector(body)@“a&b”
不能这将确保索引仅与用于创建索引项的相同配置一起使用。
可以设置更复杂的表达式索引,其中配置名称由另一列指定,例如:
CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector(config_name, body));
哪里配置名称
中有一列pgweb
桌子这允许在同一索引中混合配置,同时记录每个索引项使用的配置。例如,如果文档集合包含不同语言的文档,这将非常有用。同样,要使用索引的查询必须措辞匹配,例如。,到哪里去_tsvector(配置名称,正文)@“a&b”
.
索引甚至可以连接列:
CREATE INDEX pgweb_idx ON pgweb USING GIN (to_tsvector('english', title || ' ' || body));
另一种方法是创建单独的tsvector
列来保存到_tsvector
。要使此列自动更新其源数据,请使用存储的生成列。这个例子是标题
和身体
,使用合并
确保一个字段在另一个字段被删除时仍将被索引无效的
:
ALTER TABLE pgweb
ADD COLUMN textsearchable_index_col tsvector
GENERATED ALWAYS AS (to_tsvector('english', coalesce(title, '') || ' ' || coalesce(body, ''))) STORED;
然后我们创建一个GIN索引以加快搜索速度:
CREATE INDEX textsearch_idx ON pgweb USING GIN (textsearchable_index_col);
现在,我们已经准备好执行快速全文搜索:
SELECT title
FROM pgweb
WHERE textsearchable_index_col @@ to_tsquery('create & table')
ORDER BY last_mod_date DESC
LIMIT 10;
与表达式索引相比,单独列方法的一个优点是,为了使用索引,不必在查询中显式指定文本搜索配置。如上面的例子所示,查询可以依赖于默认文本搜索配置
。另一个优点是搜索速度更快,因为无需重做搜索到_tsvector
调用以验证索引匹配。(使用GiST索引比GIN索引更重要;请参见第12.9节。然而,表达式索引方法的设置更简单,而且自tsvector
表示不是显式存储的。