1

私はこのようなデータベーステーブルを持っています

Port Code     | Country   |Port_Name
--------------------------------------
 1234         | Australia | port1
 2345         | India     | Mumbai
 2341         | Australia | port2
 ...

テーブルは約12000のエントリで構成されています。ユーザーがクエリを入力すると、オートコンプリートが必要になります。これで、クエリはポートコード、国、またはポート名のいずれかになります。たとえば、ユーザーの部分クエリが「12」の場合ドロップダウンが表示され1234 | Australia | port1ます。現在直面している問題は、ユーザーエントリごとにデータベースにクエリを実行しているため、オートコンプリートが非常に遅くなることです。これを最適化する方法はありますか?

4

3 に答える 3

1

Luceneと RAMDirectoryを使用してこれを行うことができます。データにインデックスを作成し、データ ルックアップ サービスを実装して、データベースに変更があったかどうかを時々チェックします。または、Lucene インデックスのデータベースからのその他の更新。DB のインデックス作成については Lucene を参照し、クエリについてはMultiFieldQueryParserを使用します。

于 2010-11-09T08:17:40.207 に答える
1

smartgwt では、comboboxitem を使用します。次のように、comboxitem の getPickListFilterCriteria をオーバーライドします

ComboBoxItem portSelect = new ComboBoxItem("PORT_ATTRIB", "") {

      @Override
      public Criteria getPickListFilterCriteria() {
        if (getValue() != null && getValue() instanceof String) {
          criteria = new AdvancedCriteria(OperatorId.AND, new Criterion[]{new Criterion("portValue",
              OperatorId.EQUALS, getDisplayValue())});
        }
        return criteria;
      }
    };

キーを押すたびに、クエリに渡すことができる基準が得られます。クエリは次のようになりますselect * from port where portName like '+criteria+%' or portCode like '+criteria+%

于 2010-11-18T09:12:22.707 に答える
0

データベースは正しく索引付けされていますか? インデックス付きの列の検索は非常に高速である必要があります.12,000行はリレーショナルDBにとって大したことではありません.

私が提案できるもう 1 つのことは、データベース テーブル データをインメモリ テーブルにロードすることです。私は長い間MySQLでこれを行ってきました: http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html。これは、データがあまり頻繁に変更されない場合に特に役立ちます。そのため、メモリ内テーブルへのデータの 1 回のロードが迅速になります。その後、すべてのクエリをこのインメモリ テーブルで実行する必要があり、これらは驚くほど高速です。

于 2010-11-09T09:04:15.207 に答える