我第一次使用 Postgresql,我正在尝试在我的网站中创建一个搜索引擎。我有这张表:
CREATE TABLE shop (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
address TEXT NOT NULL,
city TEXT NOT NULL
);
然后我为表的每个字段创建一个索引(这是正确的方法吗?或者我可以为所有字段创建一个索引?):
CREATE INDEX shop_name_fts ON shop USING gin(to_tsvector('italian', name));
CREATE INDEX shop_desc_fts ON shop USING gin(to_tsvector('italian', description));
CREATE INDEX shop_addr_fts ON shop USING gin(to_tsvector('italian', address));
CREATE INDEX shop_city_fts ON shop USING gin(to_tsvector('italian', city));
现在,如果我想在每个索引中搜索一个单词,那么 SQL 查询是什么?
我尝试了这个并且它有效:
SELECT id FROM shop WHERE to_tsvector(name) @@ to_tsquery('$word') OR
to_tsvector(description) @@ to_tsquery('$word') OR
to_tsvector(address) @@ to_tsquery('$word') OR
to_tsvector(city) @@ to_tsquery('$word')
是否存在更好的方法来做同样的事情?
我可以搜索吗to_tsquery
分成多个to_tsvector
?
我的一个朋友提出了一个解决方案,但它是针对 MySQL 数据库的:
SELECT * FROM shop WHERE MATCH(name, description, address, city) AGAINST('$word')
Postgresql 的解决方案是什么?
另外,我可以搜索多个吗?to_tsquery
分成多个to_tsvector
?如果我想搜索两个单词或多个单词,那么 SQL 查询是什么?我可以从 PHP 传递“两个单词”到 $word 吗?如果可以的话,它是如何工作的?它是搜索第一个单词和第二个单词还是第一个单词或第二个单词?