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 索引进行的任何其他更新。请参阅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

您的数据库索引是否正确?对索引列的查找应该非常快——12k 行对于任何关系数据库来说都不是什么大问题。

我可以建议的另一件事是将数据库表数据加载到内存表中。我很久以前在 MySQL 中做过这个:http: //dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html。如果数据不经常更改,这将特别有帮助 - 因此将数据一次性加载到内存表中会很快。之后,所有查询都应该在这个内存表上执行,而且速度非常快。

于 2010-11-09T09:04:15.207 回答