我试图让这样的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索引中找到,但为什么不喜欢/ 2或ilike / 2工作?输入全名" Asymptote"时,我能够找到记录。
答案 0 :(得分:10)
我遇到了一些类似的问题。不幸的是我没有pg_trgm可用。我使用LIKE,如:
from candidate in query,
where: like(candidate.first_name, ^("%#{text}%"))
这匹配于candidate.first_name。
的任何位置的文本答案 1 :(得分:0)
在Rokkincat的Mitchell Henke的帮助下,这是让pg_trgm使用自定义匹配百分比的方法:
def find(searchterm) do
limit = 0.1
query = from c in Contact,
where: fragment("similarity(?, ?) > ?", c.company_name, ^searchterm, ^limit),
#where: like(c.company_name, ^searchterm),
contacts = Repo.all(query)
{:ok, contacts}
end
但我还是不能像/ 2那样工作。此外,我没有看到Ecto源中存在此函数的位置。