【问题标题】:Ecto where like query acts like where ==Ecto where like 查询的作用类似于 where ==
【发布时间】: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 不应该那样工作

标签: phoenix-framework ecto


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在 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 源中的哪个位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 2016-10-30
      • 1970-01-01
      • 2021-09-29
      相关资源
      最近更新 更多