【发布时间】:2015-05-14 02:55:13
【问题描述】:
我正在尝试让类似 ecto 的查询像这样工作:
def find(searchterm) do
query = from c in Contact,
#where: fragment("? % ?", c.company_name, ^searchterm),
where: like(c.company_name, ^searchterm),
contacts = Repo.all(query)
{:ok, contacts}
end
在我的表中,我有一个公司名称“Asymptote”。使用 where:like/2 我的查询如下所示:
SELECT c0."id", c0."company_id", c0."company_name" FROM "contacts" AS c0 WHERE (c0."company_name" LIKE $1) ["Asym"] (1.0ms)
当 pg_trm 搜索取消注释时,它看起来像这样:
SELECT c0."id", c0."company_id", c0."company_name" FROM "contacts" AS c0 WHERE (c0."company_name" % $1) ["Asym"] (1.0ms)
据我所知,查询看起来不错,但没有结果。由于我在将“Asymptote”添加到数据库后添加了索引,我希望这就是为什么在 pg_trm 索引中找不到它的原因,但为什么 like/2 或 ilike/2 不起作用?当输入全名“Asymptote”时,我能够找到记录。
【问题讨论】:
-
我认为这是与 pg_trgm 的默认相似性匹配限制的问题。它能够在我的 company_name 列中找到较短的值(如“google”),所以我认为这是默认限制参数的问题。 like/2 不应该那样工作