Ecto在哪里查询就像where ==

Dan*_*_es 7 ecto phoenix-framework

我试图得到像这样的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
Run Code Online (Sandbox Code Playgroud)

在我的表中,我有一个company_name"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)
Run Code Online (Sandbox Code Playgroud)

当pg_trm搜索取消注释时,它看起来像这样:

SELECT c0."id", c0."company_id", c0."company_name" FROM "contacts" AS c0 WHERE (c0."company_name" % $1) ["Asym"] (1.0ms)
Run Code Online (Sandbox Code Playgroud)

据我所知,查询看起来不错,但没有结果.由于我在向数据库添加"渐近线"之后添加了索引,我希望这就是为什么在pg_trm索引中找不到它,但为什么不喜欢/ 2或ilike/2工作?输入全名"Asymptote"时,我能够找到记录.

小智 10

我遇到了一些类似的问题.不幸的是我没有pg_trgm可用.我用LIKE作为:

  from candidate in query,
  where: like(candidate.first_name, ^("%#{text}%"))
Run Code Online (Sandbox Code Playgroud)

这与candidate.first_name的任何位置的文本匹配.


Dan*_*_es 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
Run Code Online (Sandbox Code Playgroud)

但我仍然无法让 like/2 工作。另外,我没有看到这个函数在 Ecto 源代码中的哪个位置存在。