小编SBa*_*aha的帖子

使用相似Postgres模糊自连接查询提高性能

我正在尝试运行一个连接表自身的查询,并进行模糊字符串比较(使用trigram比较)来查找可能的公司名称匹配.我的目标是返回记录,其中一个记录的公司名称(ref_name字段)的三元组相似性与另一个记录的公司名称相匹配.目前,我的阈值设置为0.9,因此它只会返回很可能包含类似字符串的匹配项.

我知道自联接本质上可以导致许多比较,但我想尽我所能地优化我的查询.我不需要即时结果,但是目前我运行的查询需要11个小时才能运行.

我在Ubuntu 12.04服务器上运行Postgres 9.2.我不知道ref_name字段的最大长度(我匹配的字段)是什么,所以我将它设置为a varchar(300).我想知道将它设置为文本类型可能会影响性能,或者是否有更好的字段类型可用于加速性能.我LC_CTYPELC_COLLATE语言环境设置为"en_US.UTF-8"

我运行查询的表总共包含大约160万条记录,但运行了11个小时的查询只占一小部分(约100k).

表结构:

CREATE TABLE ref_name (
  ref_name_id integer,
  ref_name character varying(300),
  ref_name_type character varying(2),
  name_display text,
  load_date timestamp without time zone
)
Run Code Online (Sandbox Code Playgroud)

索引:

CREATE INDEX ref_name_ref_name_trigram_idx ON ref_name
  USING gist (ref_name COLLATE pg_catalog."default" gist_trgm_ops);

CREATE INDEX ref_name_ref_name_trigram_idx_1 ON ref_name
  USING gist (ref_name COLLATE pg_catalog."default" gist_trgm_ops)
  WHERE ref_name_type::text = 'E'::text;

CREATE INDEX ref_name_ref_name_e_idx ON ref_name
  USING btree (ref_name COLLATE pg_catalog."default")
  WHERE ref_name_type::text = 'E'::text;
Run Code Online (Sandbox Code Playgroud)

查询:

select a.ref_name_id as name_id,a.ref_name …
Run Code Online (Sandbox Code Playgroud)

postgresql performance self-join duplicate-removal trigram

3
推荐指数
1
解决办法
1517
查看次数

从Jcombobox中删除特定项目

我使用DefaultComboBoxModel和自定义Item填充组合框.每个项目都包含一个ID和一个名称.我正在遍历一个表,并根据选择,我想从组合框中删除选定的元素.对于我想删除的项目,我有我正在迭代的表中的ID和名称.我尝试使用removeItem接受一个对象.我将ID和Name传递给我的自定义Item构造函数,但这似乎不起作用.谁能告诉我这里缺少什么?

填充组合框的代码:

Vector<Object> companyList = new Vector<Object>();
        while(rs.next()){
            companyList.addElement(new Item(rs.getInt(1),rs.getString(2)));
        }
DefaultComboBoxModel cmod = new DefaultComboBoxModel(companyList);
        companyName.setModel(cmod);
Run Code Online (Sandbox Code Playgroud)

自定义项代码:

class Item
{
    private int id;
    private String name;

    public Item(int id, String name)
    {
        this.id = id;
        this.name = name;
    }

    public int getId()
    {
        return id;
    }

    public String getName()
    {
        return name;
    }

    public String toString()
    {
        return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

删除Item的代码(本例中为硬编码):

 companyName.removeItem(new Item(50002,"ALLIED WASTE SYSTEMS"));
Run Code Online (Sandbox Code Playgroud)

removeItem说它接受一个Object所以我不确定为什么这不起作用.任何帮助,将不胜感激!

java swing jcombobox comboboxmodel

1
推荐指数
1
解决办法
5542
查看次数