gpt4 book ai didi

sql - Postgres 全文搜索 : how to search multiple words in multiple fields?

转载 作者:行者123 更新时间:2023-11-29 12:37:06 25 4
gpt4 key购买 nike

我是第一次使用 Postgresql,我正在尝试在我的网站上创建一个搜索引擎。我有这张 table :

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 中吗?我的一个 friend 提出了一个解决方案,但它是针对 MySQL 数据库的:

SELECT * FROM shop WHERE MATCH(name, description, address, city) AGAINST('$word')

Postgresql 的解决方案是什么?

此外,我可以将多个to_tsquery搜索到多个to_tsvector中吗?如果我想搜索两个词或多个词,SQL 查询是什么?我可以从 PHP 将“两个词”传递给 $word 吗?如果可以,它是如何工作的?它是搜索第一个词和第二个词,还是搜索第一个词或第二个词?

最佳答案

看起来您想要的实际上是搜索所有这些字段的串联。

您可以构建一个查询来执行此操作

... where to_tsvector('italian', name||' '||coalesce(decription,'')...) @@ to_tsquery('$word')

并在完全相同的计算上建立索引:

create index your_index on shop
using GIN(to_tsvector('italian',name||' '||coalesce(decription,'')...))

不要忘记在接受 NULL 值的列上使用 coalesce

关于sql - Postgres 全文搜索 : how to search multiple words in multiple fields?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com