方案:
我有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个不同大小的表的结果进行标准化处理?
答案 0 :(得分: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
使用实际数据表的结果似乎很简单。
答案 1 :(得分:0)
作为说明:
YaK的上述建议可能是提出此问题的大多数情景的最佳选择。我实际采取的路线是记录5个表中每个表的平均最高相关性得分。然后,我将通过该因子划分未来的相关性分数,以试图“标准化”分数,以便可以将它们与其他表格的相关性分数进行比较。到目前为止,它运作良好,但并不完美(特别是大型查询)。