2014-12-03 17 views
5

我使用卦像這樣在Postgres的全文搜索:如何在Postgres中執行簡單的地圖縮小?

SELECT * 
FROM "Users" users 
WHERE 'search_text' % ANY(regexp_split_to_array(users.name,E'\\s+')) 

查詢以上檢查如果search_text任何字(斯普利特whitespace)在User.displayName匹配。這可行,但結果不是由實際的「分數」排序。

得分可以通過similarity(text,text)函數來計算。

問題是我必須按他們的順序排列所有在User.name中找到的每個單詞的相似度。因此,如果用戶名是"A B C"那麼它的分數應該是:

similarity('search_text','A') + similarity('search_text','B') + similarity('search_text','C') 

所以我需要映射用戶名的話分數,然後相加(減少)他們。我如何在postgres中做到這一點?

回答

1

在,而不是分裂將數組分割到一組,然後重新組合和總結了相似

with users as (
    select user_id, name 
    from (values (1, 'John Smith')) t(user_id, name) 
) 
select user_id, sum(similarity('smth', name_part)) 
from (
    select user_id, regexp_split_to_table(name, E'\\s+') as name_part 
    from users 
) users 
where 'smth' % name_part 
group by user_id 
order by 2 desc 
; 
user_id | sum 
---------+------- 
     1 | 0.375 

我不知道你想消除這些名稱零件,其相似性低於閾值。如果不只是省略where子句

順便說一句,爲什麼你需要拆分名稱?爲什麼不把全名與搜索字符串進行比較?

with users as (
    select user_id, name 
    from (values (1, 'John Smith')) t(user_id, name) 
) 
select similarity('jon smth', name), * 
from users 
order by 1 desc 
; 
similarity | user_id | name  
------------+---------+------------ 
    0.333333 |  1 | John Smith 
相關問題