2013-03-10 170 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