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)

私が見る限り、クエリは問題ないように見えますが、結果はありません。データベースに "Asymptote" を追加した後にインデックスを追加したので、それが pg_trm インデックスに見つからない理由だと思いますが、like/2 または ilike/2 が機能しないのはなぜですか? 「Asymptote」というフルネームで入力すると、レコードを見つけることができます。

4

2 に答える 2

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 に答える