环境:Ruby on Rails、Postgres
我面临挑战,要进行与服务名称及其位置相匹配的搜索......
例如:“巴黎的披萨”
我相信这在形成 SQL 查询之前需要一个语法分析器......
我只是想知道是否有一种我不知道的技术,......是的,比如我的数据库的搜索引擎。
环境:Ruby on Rails、Postgres
我面临挑战,要进行与服务名称及其位置相匹配的搜索......
例如:“巴黎的披萨”
我相信这在形成 SQL 查询之前需要一个语法分析器......
我只是想知道是否有一种我不知道的技术,......是的,比如我的数据库的搜索引擎。
使用 PostgreSQL,您可以在表中创建引用多个列的 tsv_vector 列,为该表添加更新触发器以使其保持最新,并使用全文搜索来构建查询
create table food(
table_id serial primary key,
food_type text not null,
location text not null,
food_tsv tsvector
);
创建表触发器
CREATE TRIGGER tsvector_food_update BEFORE INSERT OR UPDATE ON food
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger(food_tsv, 'pg_catalog.english', food, location);
CREATE INDEX food_index_tsv ON food USING gin(food_tsv);
示例 SQL 查询将为您提供按相关性排序的结果
SELECT * FROM (
SELECT DISTINCT ON (f.table_id) f.*, ts_rank_cd(f.food_tsv, query) AS rank FROM to_tsquery(searchTerm) AS query, food as f
WHERE (f.food_tsv @@ query)
ORDER BY f.table_id DESC LIMIT :limit OFFSET :offset
) AS sub ORDER BY rank DESC