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 から 1 つのリストを取得し、SphinxQL を使用してステップバイステップでサイクルで実行します。最初のリストの 500 行と 2 番目のリストの 400 000 行でほぼ 2 秒間実行されます。各行のクエリは次のようになります。

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

2 つのリスト間で等しいデータを見つける最良の方法は何ですか?

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 は、列全体でグループ化するのではなく、特別に処理されるため、各値で個別にグループ化されます。おそらく、mva を文字列属性に複製できます (そのため、グループ化するとすべての値が取得されるため、重複が見つかります)。

... そして、FIELDS はさらに複雑です。フィールドでグループ化することはまったくできません。同じトリックを使用して、フィールドを文字列属性に複製できます。これにより、再びグループ化できます。

(ただし、文字列属性のグループ化は「正確」です。つまり、2 つの文字列があらゆる点で同一である場所を見つけます。より「あいまい」な一致が必要な場合、つまり、ステミングまたはフルテキスト一致の他の同様の機能を使用する場合は、より複雑になります。 2 段階のアプローチでは、GROUP BY を使用して属性が一致する行を取得し、より直接的なクエリを実行して、フィールドが十分に類似しているかどうかを確認します。

于 2015-11-08T22:26:27.390 に答える