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的任何位置的文本匹配.
在 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 源代码中的哪个位置存在。
| 归档时间: |
|
| 查看次数: |
3274 次 |
| 最近记录: |