Ecto在哪里查询就像在哪里==

时间:2015-05-14 02:55:14

标签: phoenix-framework ecto

我试图让这样的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"时,我能够找到记录。

2 个答案:

答案 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源中存在此函数的位置。