Sphinx搜索 - 比较两个数据列表

时间:2015-11-06 17:49:50

标签: sphinx sphinxql

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

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

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

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

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

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

P.S。:喜欢SphinxQL。

1 个答案:

答案 0 :(得分: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获取属性匹配的行,然后运行更有针对性的查询以查找字段是否足够相似。