一个字段搜索以匹配数据库中的多个列

时间:2013-03-10 21:59:53

标签: sql ruby-on-rails search-engine

环境:Ruby on Rails,Postgres

我越来越难以进行与服务名称及其位置匹配的搜索...

前:"巴黎比萨"

我认为在形成SQL查询之前需要语法分析器...

我只是想知道是否有一种我不知道的技术,...是的,比如我的数据库的搜索引擎。

1 个答案:

答案 0 :(得分:1)

使用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