2014-07-04 165 views
1

如果這是一個愚蠢的問題,請原諒我。使用PostgreSQL進行全文搜索和模糊搜索

我在遷移的一個下面的代碼:

DB::statement(" 
    CREATE MATERIALIZED VIEW searchable_stores AS 
    SELECT 
    chain_stores.id as chain_store_id, 
    local_chain_stores.id as local_chain_store_id, 
    chain_stores.website as website, 
    chain_stores.name as name, 
    chain_stores.cname as cname, 
    chain_stores.flyer_url as flyer_url, 
    local_chain_stores.city as city, 
    local_chain_stores.shopping_mall as shopping_mall, 
    local_chain_stores.postal_code as postal_code, 
    local_chain_stores.street_address as street_address, 
    to_tsvector('sv', chain_stores.name) || 
    to_tsvector('sv', replace(chain_stores.name, ' ', '')) || 
    to_tsvector('sv', local_chain_stores.city) || 
    to_tsvector('simple', to_char(local_chain_stores.postal_code, '99999')) || 
    to_tsvector('sv', coalesce(local_chain_stores.shopping_mall)) || 
    to_tsvector('sv', local_chain_stores.street_address) || 
    to_tsvector('sv', chain_stores.bio) 
    as document 
    FROM 
     local_chain_stores, chain_stores 
    WHERE 
     local_chain_stores.chain_store_id = chain_stores.id 
    "); 

這就是我如何查詢表:

$results = SearchableStore:: 
     whereRaw("document @@ plainto_tsquery('simple', ?)", array($searchQuery->getQuery())) 
     ->orWhereRaw("document @@ plainto_tsquery('sv', ?)", array($searchQuery->getQuery())) 
     ->orderBy('name', 'asc') 
     ->get(); 
    return $results; 

這工作完全正常,除非有人闡明一些字(S )錯了。這就是我想要解決的問題。您還會注意到,這兩條線:

to_tsvector('sv', chain_stores.name) || 
    to_tsvector('sv', replace(chain_stores.name, ' ', '')) || 

我知道這是醜陋的,但什麼,我基本上做的是要確保,如果有人做了如「漢堡王」的搜索,我想爲「漢堡王返回結果」。我知道這看起來像一個愚蠢的例子,但是這些錯誤在瑞典語中發生了很多(對於漢堡王來說並不一定,但其他條款)。除此之外,我還想確保當有人輸錯時,我仍然想要返回相關結果。

所以,我的問題是。我如何實現這一點?我試着玩模糊搜索,但我有點卡住,因爲我不知道如何查詢由tsvector值組成的列(文檔)。

回答

3

Full Text Search適用於詞典和詞幹,不適合模糊搜索和一般模式匹配。
考慮到附加模塊pg_trgm。它的運算符類允許支持LIKE的GIN或GiST索引以及相關的模式匹配運算符。

詳情參加本次相關答案:
PostgreSQL LIKE query performance variations

概述了模式匹配技術在Postgres的:
Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL

+0

感謝您的寶貴意見。我實際上玩過這個模塊。問題是我不知道用戶會搜索什麼。他可能會一次搜索連鎖商店,城市,商場或所有三個商店。我沒有看到如何使用LIKE解決我的問題。 – user1904218

1

你在尋找什麼是同義詞和近義詞詞典,這是一個很多工作編譯它們,但是會使你的搜索方式在CPU和磁盤使用方面更具成本效益。

對於某些語言,您可以在OpenOffice中輕鬆轉換爲您自己的其他人使用的詞典詞典。我仍然在尋找好的消息來源,並在這裏發佈了關於這個話題的問題:https://dba.stackexchange.com/questions/80632/where-to-download-dutch-postgresql-fulltext-search-dictionaries,到目前爲止還沒有答案。

如果你正在運行Linux,它也證明值得你安裝你的語言的myspell或hunspell軟件包。爲了安裝這些包的看到:https://askubuntu.com/questions/72099/how-to-install-a-libreoffice-dictionary-spelling-check-thesaurus

如果你想知道如何使用它們的PostgreSQL,你應該如何配置全文搜索讀了,我真的很喜歡這個傢伙,因爲這裏的光線和理解的方式寫一下吧: a full text search engine