Mac OS X YosemiteでPostgreSQL 9.3を実行しています。
アクセントのない小文字のトライグラムインデックスを作成しようとします。それを達成するために私はこれをしました:
mydb=# CREATE EXTENSION pg_trgm SCHEMA public VERSION "1.1";
CREATE EXTENSION unaccent SCHEMA public;
ALTER FUNCTION unaccent(text) IMMUTABLE;
CREATE EXTENSION
CREATE EXTENSION
ALTER FUNCTION
次に、インデックスを作成しようとしました:
mydb=# CREATE INDEX author_label_hun_gin_trgm ON address
USING gin (public.unaccent(lower(label_hun)) gin_trgm_ops);
ERROR: text search dictionary "unaccent" does not exist
...そして、このエラーが発生しました。利用可能なテキスト検索辞書を一覧表示しようとすると、unaccent
辞書がそこにあるようです:
mydb=# \dFd
List of text search dictionaries
Schema | Name | Description
------------+-----------------+-----------------------------------------------------------
pg_catalog | danish_stem | Snowball stemmer for danish language
pg_catalog | dutch_stem | Snowball stemmer for dutch language
pg_catalog | english_stem | Snowball stemmer for english language
pg_catalog | finnish_stem | Snowball stemmer for finnish language
pg_catalog | french_stem | Snowball stemmer for french language
pg_catalog | german_stem | Snowball stemmer for german language
pg_catalog | hungarian_stem | Snowball stemmer for hungarian language
pg_catalog | italian_stem | Snowball stemmer for italian language
pg_catalog | norwegian_stem | Snowball stemmer for norwegian language
pg_catalog | portuguese_stem | Snowball stemmer for portuguese language
pg_catalog | romanian_stem | Snowball stemmer for romanian language
pg_catalog | russian_stem | Snowball stemmer for russian language
pg_catalog | simple | simple dictionary: just lower case and check for stopword
pg_catalog | spanish_stem | Snowball stemmer for spanish language
pg_catalog | swedish_stem | Snowball stemmer for swedish language
pg_catalog | turkish_stem | Snowball stemmer for turkish language
public | unaccent |
ここで何が間違っているのでしょうか?
IMMUTABLE
unaccent()
関数を取得するには、この代替アプローチをお勧めします。
_CREATE OR REPLACE FUNCTION f_unaccent(text)
RETURNS text AS
$func$
SELECT public.unaccent('public.unaccent', $1) -- schema-qualify function and dictionary
$func$ LANGUAGE sql IMMUTABLE;
_
その関数を式インデックスとすべてのクエリで使用します。詳細な説明:
そして、notを実行して元の関数を変更します。
ALTER FUNCTION unaccent(text) IMMUTABLE;
.. _search_path
_ で起こりうる問題も解決します:インデックス定義でpublic.unaccent()
をスキーマ修飾する必要があったという事実は、public
がない可能性があることを示唆していますあなたの_search_path
_で。
次に、インデックス:
_CREATE INDEX author_label_hun_gin_trgm ON address
USING gin (f_unaccent(label_hun) gin_trgm_ops);
_
を含めなかったlower()
を含めなかった。あなたはできますが、トライグラムインデックスは、大文字と小文字を区別しないパターンをすぐにサポートします。
これらすべてを同じ_search_path
_を使用して同じセッションで実行し、次の__function ... does not exist
_の報告中に1つの呼び出しが機能する場合、データベースで重大な障害が発生しています。
まず、有効な_search_path
_設定でテストしていることを確認してください:
_SHOW search_path
_
この関連回答の詳細
破損を診断する場合は、アラームモードに切り替えて、データの損失を回避するために必要なすべての手順を実行します(何かを行う前にバックアップを作成するなど)。
システムテーブル_pg_proc
_の壊れたインデックスが原因である可能性があります。 To reindex シェルからのすべてのシステムテーブル:
_reindexdb [connection-option...] --system mydb
_