3

シナリオ

検索する必要のあるテーブルが5つあります。それぞれに適切なフルテキストインデックス(インデックス?)があります。MATCHとAGAINSTを使用してそれぞれを個別に検索し、関連性スコアで並べ替えることができます。

問題は、5つのテーブルすべての検索結果を組み合わせて織り交ぜ、関連性スコアに基づいて計算したいということです。そのようです:

(SELECT *, MATCH(column) AGAINST (query) as score
FROM table1
WHERE MATCH (column) AGAINST (query))
UNION
(SELECT *, MATCH(column) AGAINST (query) as score
FROM table2
WHERE MATCH (column) AGAINST (query))
UNION
...
ORDER BY score DESC

これは、テーブル1の行数がテーブル2の2倍になる場合を除いて、うまく機能します。したがって、mySQLは関連性の一意性を考慮しているため、テーブル1の結果のスコアはほとんどの場合テーブル2の結果よりも大幅に高くなります。

最終的に:各テーブルの結果に均等に重みを付けたい場合、さまざまなサイズの5つのテーブルの結果のスコアを正規化するにはどうすればよいですか?

4

2 に答える 2

1

5つのテーブルUNIONの結果を使用すると、おそらく5つのテーブルを1つのテーブルにマージする必要があると思います(現在5つのテーブルに分散している5つのタイプのデータの1つを識別する追加の列があります)。

同様に、次のように、テキスト列だけを1つのテーブルに格納できます。

CREATE TABLE text_table (
    text_col TEXT,
    fk INT, -- references the PK of an item in either table1, or table2, or...
    ref_table INT, -- identifies the related table, e.g. 1 means 'table1', etc.
    FULLTEXT INDEX (text_col)
)

次に、このテーブルでフルテキスト検索を実行できます。JOIN結果を実際のデータテーブルで処理するのは簡単なようです。

于 2012-10-31T13:37:06.953 に答える
0

注として:

YaKによる上記の提案は、この質問をするほとんどのシナリオに最適なオプションである可能性があります。私が実際にたどったルートは、5つのテーブルのそれぞれの平均最高関連性スコアを記録することでした。次に、他のテーブルの関連性スコアと比較できるように、スコアを「正規化」するために、将来の関連性スコアをこの係数で除算します。これまでのところうまく機能していますが、完全ではありません(特に大規模なクエリ)。

于 2012-11-04T20:45:45.587 に答える