2017-07-31 52 views
1

我目前正在使用ExpressJS,PostgreSQL和Sequelize作爲ORM的項目中工作。我開發了一個搜索功能,使一個查詢,按名稱搜索項目:在Sequelize中無法使用

models.foo.findAll({ 
    where: { 
    $or: [ 
     {name: {$ilike: keywords}}, 
     {searchMatches: {$contains: [keywords]}} 
    ] 
    }, 
    order: [['name', 'ASC']] 
}) 

這工作得很好,但如果名稱中包含特殊字符(如A,E,I,O或U)這個查詢贏得」找到它。

有沒有辦法讓查詢搜索名稱與speacial字符在一個有意義的意義?如果我搜索名稱「馬鈴薯」結果「土豆」,「大鍋飯」和「我們是pótatóes」將出來,但不是「我們吃pátatos」(因爲á!= o)

+0

我只是評論,因爲我不認爲我的解決方法是答案材料。我之前通過sequelize解決了這個問題並失敗了,所以我設計了一個解決方法函數,該函數創建了一個數組,其中包含與給定字符串中的元音和重音符號的每個單獨排列一樣多的元素。這個數組將用於在集合查詢中構建'$或'數組。 –

+0

@FranciscoFarías我發佈了一個可能對你有用的答案。 – Potray

回答

0

A字典可能是你在找什麼。基本上可用於映射同義詞並排除索引中的常見元素(例如,來自英文文本的「a」和「the」)以及其他內容。

https://www.postgresql.org/docs/current/static/textsearch-dictionaries.html

+0

我不認爲這是我正在尋找的,因爲我無法映射每個可以用作名稱的單詞,因爲用戶可以將新單詞作爲名稱。 – Potray

+1

@Potray您可以使用預製的。看起來像你發現了一個不同的解決方案,但做得很好:) – Scoots

1

我終於找到了一個有效的解決方案。首先,我創建了unaccent擴展:

create extension unaccent; 

然後,我只是用一個原始查詢(我無法弄清楚如何使用Sequelize的方式來建立查詢)是這樣的:

models.sequelize.query(
    `SELECT 
     * 
    FROM 
     "Foos" 
    WHERE 
     unaccent("name") ilike unaccent('${keywords}')   
     OR "searchMatches" @> ARRAY[unaccent('${keywords}')]::VARCHAR(255)[] 
    ORDER BY 
     "name" ASC`, {model: models.Foo}) 

而且它的工作原理!