web-dev-qa-db-ja.com

「エラー:テキスト検索辞書 "不明な"は存在しません」がCREATE INDEX中に発生しましたか?

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        | 

ここで何が間違っているのでしょうか?

4

IMMUTABLEunaccent()関数を取得するには、この代替アプローチをお勧めします。

_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
_
6