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 的两倍之外,这很好用。因此,由于 mySQL 考虑了相关性的唯一性,因此表 1 的结果得分通常明显高于表 2 的结果。

最终:如果我想对每个表的结果进行平均加权,如何对 5 个不同大小的表的结果分数进行标准化?

4

2 回答 2

1

UNION对五个表的结果的了解使我相信您可能应该将五个表合并为一个表(可能还有一个附加列,用于标识目前分布在五个表中的五种数据类型之一)。

同样,您可以仅将文本列存储在一个表中,如下所示:

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 回答