环境:Ruby on Rails,Postgres
我越来越难以进行与服务名称及其位置匹配的搜索...
前:"巴黎比萨"
我认为在形成SQL查询之前需要语法分析器...
我只是想知道是否有一种我不知道的技术,...是的,比如我的数据库的搜索引擎。
答案 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