0

环境:Ruby on Rails、Postgres

我面临挑战,要进行与服务名称及其位置相匹配的搜索......

例如:“巴黎的披萨”

我相信这在形成 SQL 查询之前需要一个语法分析器......

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

4

1 回答 1

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
于 2013-03-10T22:05:05.277 回答