0

列表(两个列表字段相等)示例:

name(rt_field): Aaaaaa
attr1(rt_attr_uint): 3
attr2(rt_attr_uint): 0
attr3(rt_attr_multi): (a,b,c,d...)

我的目标是在两个列表中找到相等的数据。

我现在这样做的方式 - 我从 MySQL db 中获取一个列表,并使用 SphinxQL 逐步运行它。它运行了将近 2 秒,第一个列表中有 500 行,第二个列表中有 400 000 行。我对每一行的查询如下:

SELECT id FROM list2 WHERE MATCH('Name') AND attr1=9 AND attr2=0 AND attr3 IN (a,b,x)

在两个列表之间找到相等数据的最佳方法是什么?

PS:更喜欢SphinxQL。

4

1 回答 1

1

好吧,如果它只是缩放器属性,那将很容易...

SELECT *,COUNT(*) AS cnt FROM list1, list2 GROUP BY attr1, attr2 HAVING cnt > 1 

(也可以使用 GROUP_CONCAT() 来获取所有重复的 id)

但是 MVA 属性更复杂,因为对 MVA 列的 GROUP BY'ing 是特殊处理的,而不是按整个列分组,而是按每个值单独分组。您也许可以将 mva 复制到一个字符串属性中(因此对其进行分组将采用所有值,从而找到重复项)

...和FIELDS更加复杂。您根本无法对字段进行分组。您可以使用相同的技巧并将字段复制到字符串属性中 - 然后再次允许您对其进行分组。

(但字符串属性分组是“精确的”,即找到两个字符串在各个方面都相同的位置。如果您想要更多的“模糊”匹配,即使用词干或全文匹配的其他类似功能,它会更复杂。也许可以使用两阶段方法,使用 GROUP BY 获取属性匹配的行,然后运行更有针对性的查询以查找字段是否足够相似。

于 2015-11-08T22:26:27.390 回答