3

インターネットは私の問題を聞いたことがないようなので、何日もウェブで検索しました:

私は、英国の約 37M レコードを保持する郵便住所データベース テーブルを持っています。このテーブルには、地理空間インデックスと、次のように作成された派生全文インデックスがあります。

create index on gb_locations using gin(to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3");)

私の全文検索の形式は次のとおりです。

SELECT * FROM gb_locations
WHERE
    to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3") @@ plainto_tsquery('english', 'greenham road rg14')

このクエリは、ほとんどの英国の住所、特にロンドン地域では正常に機能しますが、さらに離れた場所では結果が返されません。

地理空間検索を使用してレコードを見つけることができるため、レコードがテーブルに存在することを確認しましたが、全文検索の場合、データベースがそれを認識していないようです。

これは説明です:

Bitmap Heap Scan on gb_locations  (cost=52.04..56.10 rows=1 width=521)
  Recheck Cond: (to_tsvector('english'::regconfig, ((((((((((("Postcode")::text || ' '::text) || ("Postcode_outcode")::text) || ' '::text) || "Road") || ' '::text) || ("Neighbourhood")::text) || ' '::text) || ("Admin2")::text) || ' '::text) || ("Admin3")::text)) @@ '''greenham'' & ''road'' & ''rg14'''::tsquery)
  ->  Bitmap Index Scan on text_search_index  (cost=0.00..52.04 rows=1 width=0)
        Index Cond: (to_tsvector('english'::regconfig, ((((((((((("Postcode")::text || ' '::text) || ("Postcode_outcode")::text) || ' '::text) || "Road") || ' '::text) || ("Neighbourhood")::text) || ' '::text) || ("Admin2")::text) || ' '::text) || ("Admin3")::text)) @@ '''greenham'' & ''road'' & ''rg14'''::tsquery)

どんなポインタでも大歓迎です。

4

2 に答える 2

5

coalesce(field, '')特定のフィールドが NULL になる可能性がある場合は、検索する文字列を取得するグローバル連結でそれらに適用する必要があります。

それ以外の場合は、コメントに示されている例の値で機能するようです:

select to_tsvector('english','RG147SW RG14 Greenham Road Newbury  West Berkshire')
  @@ plainto_tsquery('english', 'greenham road rg14');

 ?column? 
----------
 t
(1 row)

しかし、これは一致しません (結果は NULL です)。これは、が NULL の場合、またはより一般的には、オペレーターAdmin2にそのまま渡される他のフィールドの場合です。||

   select to_tsvector('english','RG147SW RG14 Greenham Road ' || NULL || ' Newbury  West Berkshire')
      @@ plainto_tsquery('english', 'greenham road rg14');

?column? 
----------

(1 row)
于 2012-12-08T15:08:28.973 に答える
3

ダニエル・ベリテが言ったことに加えて、

いずれかのフィールドがNULLであると予想される場合は、次のようにフルテキストインデックスを作成する必要があります。

create index [index name] on [table name] using gin(to_tsvector('english', coalesce("Field1",'') || ' ' || coalesce("Field2",'') || ' ' || coalesce("Field3",'') ....));

さらに、次のように、クエリ自体で同じテンプレートを使用する必要があります。

SELECT * FROM [table name] WHERE to_tsvector('english', coalesce("Field1",'') || ' ' || coalesce("Field2",'') || ' ' || coalesce("Field3",'') ....) @@ plainto_tsquery('english', '[your search sentance/phrase]');
于 2012-12-08T15:30:18.203 に答える