我正在尝试运行一个连接表自身的查询,并进行模糊字符串比较(使用trigram比较)来查找可能的公司名称匹配.我的目标是返回记录,其中一个记录的公司名称(ref_name字段)的三元组相似性与另一个记录的公司名称相匹配.目前,我的阈值设置为0.9,因此它只会返回很可能包含类似字符串的匹配项.
我知道自联接本质上可以导致许多比较,但我想尽我所能地优化我的查询.我不需要即时结果,但是目前我运行的查询需要11个小时才能运行.
我在Ubuntu 12.04服务器上运行Postgres 9.2.我不知道ref_name字段的最大长度(我匹配的字段)是什么,所以我将它设置为a varchar(300).我想知道将它设置为文本类型可能会影响性能,或者是否有更好的字段类型可用于加速性能.我LC_CTYPE和LC_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) 我使用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所以我不确定为什么这不起作用.任何帮助,将不胜感激!