在Sequelize中不起作用

我目前正在使用ExpressJS,PostgreSQL和Sequelize作为ORM的项目。 我开发了一个searchfunction,使查询按名称search项目:

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

这工作正常,但如果名称包含特殊字符(如á,é,í,ó或ú),该查询将无法find它。

有没有办法使查询search名称与speacial字符在一个有意义的意义? 就像我search名字“马铃薯”的结果“马铃薯”,“大锅饭”和“我们是pótatóes”将出来,而不是“我们吃pátatos”(因为á!= o)

我终于find了有效的解决scheme。 首先,我创build了不起眼的扩展:

 create extension unaccent; 

然后,我只是使用原始查询(我无法弄清楚如何使用Sequelize的方式来构build查询),如下所示:

 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}) 

它的工作原理!

字典可能是你在找什么。 基本上可以用来映射同义词,并排除索引中的常见元素(例如,来自英文文本的“a”和“the”)等等。

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