Elixir 如何使用Postgrex扩展?

Elixir 如何使用Postgrex扩展?,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我正在尝试使用由提供的tsvector扩展。但是我如何在我的Phoenx项目中实际使用它呢?这是我在dev.exs中的设置 config :project, Project.Repo, adapter: Ecto.Adapters.Postgres, username: "postgres", password: "postgres", database: "project_dev", hostname: "localhost", pool_size: 10, ext

我正在尝试使用由提供的tsvector扩展。但是我如何在我的Phoenx项目中实际使用它呢?这是我在dev.exs中的设置

config :project, Project.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "postgres",
  database: "project_dev",
  hostname: "localhost",
  pool_size: 10,
  extensions: [{Postgrex.Extensions.TSVector}]
这是模式

  schema "branches" do
    field :address, :string
    field :tags, {:array, :string}
    field :document, Postgrex.Extensions.TSVector

    belongs_to :bank, Bank

    timestamps()
  end
这不应该给我一个新类型
TSVector
?我得到以下错误

** (ArgumentError) invalid or unknown type Postgrex.Extensions.TSVector for field :document
更新

我尝试将模式设置为以下内容

field :document, {:array, Postgrex.Lexeme}
从数据库中检索值时,我得到以下错误
**(UndefinedFunctionError)函数Postgrex.Lexeme.type/0未定义或私有

我遇到了相同的问题。默认情况下,
tsvector
扩展在这个拉取请求之后被Postgrex包含/加载:,因此没有必要向您的
Project.Repo
配置中添加任何
:extensions
选项

我在如下迁移中创建了列:

def change do
  alter table(:diagnoses) do
    add :search_tsvector, :tsvector
  end

  execute "UPDATE diagnoses SET search_tsvector = to_tsvector('english', concat_ws(' ', description, icd10_code))"

  create index(:diagnoses, [:search_tsvector], using: :gin)
end
defp filter_by(query, :search_string, %{search_string: search_string} = args) do
  tsquery_string = StringHelpers.to_tsquery_string(search_string)

  from d in query,
    where: fragment("? @@ to_tsquery('english', ?)", d.search_tsvector, ^tsquery_string)
end
之后,事实证明,您不能简单地将
:tsvector
添加到模块架构中,因为不存在
:tsvector
exto
类型(由于扩展,只有
Postgrex
类型)

要在我的模式中使用这个新列,我需要添加一个自定义的
exto
类型,其中只包含默认的样板文件定义:

defmodule MyApp.Ecto.Types.TSVectorType do
  @behaviour Ecto.Type

  def type, do: :tsvector

  def cast(tsvector), do: {:ok, tsvector}

  def load(tsvector), do: {:ok, tsvector}

  def dump(tsvector), do: {:ok, tsvector}
end
之后,您可以在模块
模式中包含此类型:

schema "diagnoses" do
  field :icd10_code, :string
  field :description, :string
  field :search_tsvector, MyApp.Ecto.Types.TSVectorType

  timestamps_with_deleted_at()
end
我实现了如下方式搜索此
tsvector
字段:

def change do
  alter table(:diagnoses) do
    add :search_tsvector, :tsvector
  end

  execute "UPDATE diagnoses SET search_tsvector = to_tsvector('english', concat_ws(' ', description, icd10_code))"

  create index(:diagnoses, [:search_tsvector], using: :gin)
end
defp filter_by(query, :search_string, %{search_string: search_string} = args) do
  tsquery_string = StringHelpers.to_tsquery_string(search_string)

  from d in query,
    where: fragment("? @@ to_tsquery('english', ?)", d.search_tsvector, ^tsquery_string)
end

我遇到了同样的问题。默认情况下,
tsvector
扩展在这个拉取请求之后被Postgrex包含/加载:,因此没有必要向您的
Project.Repo
配置中添加任何
:extensions
选项

我在如下迁移中创建了列:

def change do
  alter table(:diagnoses) do
    add :search_tsvector, :tsvector
  end

  execute "UPDATE diagnoses SET search_tsvector = to_tsvector('english', concat_ws(' ', description, icd10_code))"

  create index(:diagnoses, [:search_tsvector], using: :gin)
end
defp filter_by(query, :search_string, %{search_string: search_string} = args) do
  tsquery_string = StringHelpers.to_tsquery_string(search_string)

  from d in query,
    where: fragment("? @@ to_tsquery('english', ?)", d.search_tsvector, ^tsquery_string)
end
之后,事实证明,您不能简单地将
:tsvector
添加到模块架构中,因为不存在
:tsvector
exto
类型(由于扩展,只有
Postgrex
类型)

要在我的模式中使用这个新列,我需要添加一个自定义的
exto
类型,其中只包含默认的样板文件定义:

defmodule MyApp.Ecto.Types.TSVectorType do
  @behaviour Ecto.Type

  def type, do: :tsvector

  def cast(tsvector), do: {:ok, tsvector}

  def load(tsvector), do: {:ok, tsvector}

  def dump(tsvector), do: {:ok, tsvector}
end
之后,您可以在模块
模式中包含此类型:

schema "diagnoses" do
  field :icd10_code, :string
  field :description, :string
  field :search_tsvector, MyApp.Ecto.Types.TSVectorType

  timestamps_with_deleted_at()
end
我实现了如下方式搜索此
tsvector
字段:

def change do
  alter table(:diagnoses) do
    add :search_tsvector, :tsvector
  end

  execute "UPDATE diagnoses SET search_tsvector = to_tsvector('english', concat_ws(' ', description, icd10_code))"

  create index(:diagnoses, [:search_tsvector], using: :gin)
end
defp filter_by(query, :search_string, %{search_string: search_string} = args) do
  tsquery_string = StringHelpers.to_tsquery_string(search_string)

  from d in query,
    where: fragment("? @@ to_tsquery('english', ?)", d.search_tsvector, ^tsquery_string)
end

请显示您的模式。我希望您有类似于
字段:document,TSVector
的smth,而它应该是完全限定的
字段:document,Postgrex.Extensions.TSVector
@mudasobwa added您是否介意尝试
:TSVector
作为字段类型(完全在您的迁移中)。根据,它应该是
字段:document,{:array,Postgrex.Lexeme}
。使用上述方法,现在获取
**(UndefinedFunctionError)函数Postgrex.Lexeme.type/0未定义或私有
请显示您的架构。我希望您有类似于
字段:document,TSVector
的smth,而它应该是完全限定的
字段:document,Postgrex.Extensions.TSVector
@mudasobwa added您是否介意尝试
:TSVector
作为字段类型(完全在您的迁移中)。根据,它应该是
字段:document,{:array,Postgrex.Lexeme}
。使用上述方法,现在获得的
**(UndefinedFunctionError)函数Postgrex.Lexeme.type/0未定义或私有