如果這是一個愚蠢的問題,請原諒我。使用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值組成的列(文檔)。
感謝您的寶貴意見。我實際上玩過這個模塊。問題是我不知道用戶會搜索什麼。他可能會一次搜索連鎖商店,城市,商場或所有三個商店。我沒有看到如何使用LIKE解決我的問題。 – user1904218