【问题标题】:Comparing Relevance Scores From mySQL full text searches from different tables比较来自不同表的 mySQL 全文搜索的相关性分数
【发布时间】:2012-10-17 00:54:30
【问题描述】:

场景

我有 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 个不同大小的表的结果分数进行标准化?

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    作为说明:

    YaK 的上述建议可能是大多数情况下提出此问题的最佳选择。我实际采取的路线是记录 5 个表中每一个的平均最高相关性分数。然后,我会将所有未来的相关性分数除以该因素,以尝试将分数“标准化”,以便将它们与其他表中的相关性分数进行比较。到目前为止,它运行良好,但并不完美(尤其是大型查询)。

    【讨论】:

      【解决方案2】:

      您对五个表的结果的UNION'ing 让我相信您可能应该将五个表合并为一个表(可能还有一个额外的列标识五种数据类型之一,目前分布在五个表)。

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

      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'用实际数据表得到结果似乎很简单。

      【讨论】:

      • 我曾考虑过合并这些表格,但在其他情况下,它们的排他性也会受益。我的后备方案是您提供的概念,即创建一个仅由 5 个感兴趣的表组合而成的可搜索列的表。我只是希望避免重复数据。感谢您提供清晰简洁的答案,非常感谢。
      • 也许您可以将文本“移动”而不是复制到此表中。只需向它添加一个数字主键,然后从您的数据表中引用它。
      • 这是一个很好的选择。感谢您的回复,我很感激。
      猜你喜欢
      • 2020-05-21
      • 1970-01-01
      • 2012-02-19
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      相关资源
      最近更新 更多