2013-03-10 140 views
0

ENV:Ruby on Rails的,Postgres的一个领域的搜索匹配多个列在数据库

我收到挑战是要进行搜索,将匹配服务,以及它的位置的名称...

例如:“比萨在巴黎”

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

我只是想知道,如果有一种技术在那里,我不知道的, ...是一些像我的数据库的搜索引擎。

回答

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 
+0

谢谢你的提示,这里有很多信息要消化!这是@@运营商,它有什么作用?并且我不知道在文档 – zabumba 2013-03-10 22:37:45

+1

中找到它的位置@@将搜索短语映射到tsv_vector,这里有更简单的示例http://linuxgazette.net/164/sephton.html,这只是一种方法以实现全文搜索,它对我很好 – DaveB 2013-03-10 22:46:46

+0

这里更多关于全文搜索的信息http://www.youlikeprogramming.com/2012/01/full-text-search-fts-in-postgresql-9-1/ THx再次戴夫,它工作得很好! – zabumba 2013-03-29 12:04:24