2

テーブルで構成されるプロパティ管理アプリケーションがあります。

tenants
landlords
units
properties
vendors-contacts

基本的に、検索するカテゴリを選択するのではなく、1つの検索フィールドですべてを検索する必要があります。これは許容できる解決策でしょうか(技術的には?)

5つのテーブルを検索することは、長期的には問題なく、サーバーを停止させることはありませんか?これを達成するための最良の方法は何ですか?

PostgreSQLの使用

4

4 に答える 4

7

検索する列を1つに集約するテーブルの結合であるビューを作成してから、その集約された列を検索してみませんか?

あなたはこのようなことをすることができます:

select 'tenants:' + ltrim(str(t.Id)), <shared fields> from Tenants as t union
select 'landlords:' + ltrim(str(l.Id)), <shared fields> from Tenants as l union
...

これには、クライアントのクエリからいくつかのロジックを埋め込む必要があります。単一のフィールドで検索するには、探しているキーを作成する方法を知っている必要があります。

とはいえ、「タイプ」の値(家主、テナントなど)を含む別の列があり、タイプとIDの両方でフィルタリングする方が、計算コストが低くなるため(さらに最適化できるため)、おそらくより良いでしょう。 )。

于 2009-06-29T16:42:14.757 に答える
4

組み込みの全文検索またはLuceneのような別の製品を使用したい。これは、異種データに対する非構造化検索用に最適化されています。

また、通常のインデックスはに使用できないことを忘れないでくださいsomething LIKE '%...%'。全文検索エンジンを使用すると、効率的な部分文字列検索も実行できます。

于 2009-06-29T16:43:21.013 に答える
3

これには、Luceneのような専用のフルテキストインデックス作成ツールを使用することをお勧めします。起動して実行する方がおそらく簡単であり、結果もより速く、より機能的です。Postgresの全文インデックスは、これに加えて構造化検索機能も必要な場合、または検索インデックスのトランザクション性が重要な場合に役立ちます。

これをデータベースに実装する場合は、代理キーを使用すると仮定すると、次のようなスキームが機能する可能性があります。

  1. 検索可能なテーブルごとに、そのテーブルの主キー列、テーブルの名前、およびそのテーブル内のすべての検索可能なフィールドの連結を含むビューを作成します。
  2. まったく同じ連結のto_tsvector()の基になる機能的なGINまたはGiSTインデックスを作成します。
  3. すべてのビューにUNIONALLを作成して、検索可能なビューを作成します。

その後、次のように検索できます。

SELECT id, table_name, ts_rank_cd(body, query) AS rank
    FROM search_view, to_tsquery('search&words') query
    WHERE query @@ body
    ORDER BY rank DESC
    LIMIT 10;
于 2009-06-29T17:31:09.727 に答える
1

あなたは元気であるはずです、そしてこれをする他の良い(簡単な)方法は本当にありません。ただし、検索しているフィールドが適切にインデックス付けされていることを確認してください。

于 2009-06-29T16:42:44.540 に答える