【发布时间】:2016-09-16 06:43:05
【问题描述】:
我有一个简单的模型:
schema "torrents" do
field :name, :string
field :magnet, :string
field :leechers, :integer
field :seeders, :integer
field :source, :string
field :filesize, :string
timestamps()
end
我想根据名称进行搜索。我将相关的扩展和索引添加到我的数据库和表中。
def change do
create table(:torrents) do
add :name, :string
add :magnet, :text
add :leechers, :integer
add :seeders, :integer
add :source, :string
add :filesize, :string
timestamps()
end
execute "CREATE EXTENSION pg_trgm;"
execute "CREATE INDEX torrents_name_trgm_index ON torrents USING gin (name gin_trgm_ops);"
create index(:torrents, [:magnet], unique: true)
end
我正在尝试使用搜索词进行搜索,但我总是得到零个结果。
def search(query, search_term) do
from(u in query,
where: fragment("? % ?", u.name, ^search_term),
order_by: fragment("similarity(?, ?) DESC", u.name, ^search_term))
end
SELECT t0."id", t0."name", t0."magnet", t0."leechers", t0."seeders", t0."source",
t0."filesize", t0."inserted_at", t0."updated_at" FROM "torrents"
AS t0 WHERE (t0."name" % $1) ORDER BY similarity(t0."name", $2) DESC ["a", "a"]
我的搜索功能有问题吗?
【问题讨论】:
-
您是否在控制台中记录了任何错误?我似乎无法在 PostgreSQL 文档中找到
%在WHERE (t0."name" % $1)中的含义。 -
@Dogbert 没有错误,只是正确的 SQL 命令输出。我从这篇文章中得到了命令:blog.rokkincat.com/postgres-full-text-search-in-ecto
-
表中有哪些记录?请注意,您的查询不会匹配名称包含
a的每条记录,而是名称非常相似的记录。尝试创建名称为"a"的记录并运行相同的查询。或创建"ab"和"abc"并搜索"ab"。
标签: postgresql indexing full-text-search elixir ecto