在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