8

我正在尝试让类似 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

在我的表中,我有一个 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)

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

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

据我所知,查询看起来不错,但没有结果。由于我在将“渐近线”添加到数据库后添加了索引,我希望这就是为什么在 pg_trm 索引中找不到它的原因,但为什么 like/2 或 ilike/2 不起作用?当输入全名“Asymptote”时,我能够找到记录。

4

2 回答 2

11

我遇到了一些类似的问题。不幸的是,我没有可用的 pg_trgm。我使用 LIKE 如下:

  from candidate in query,
  where: like(candidate.first_name, ^("%#{text}%"))

这匹配了 Candidate.first_name 任何位置的文本。

于 2015-12-15T22:09:31.280 回答
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

但我仍然无法获得 like/2 的工作。另外,我看不到这个函数在 Ecto 源代码中的什么位置。

于 2015-05-15T20:55:53.497 回答