【问题标题】:Fulltext search on many tables在许多表上进行全文搜索
【发布时间】:2010-04-30 14:12:31
【问题描述】:

我有三个表,所有表都有一个带有全文索引的列。用户将搜索词输入到单个文本框中,然后将搜索所有三个表。

用一个例子更好地解释:

documents
  doc_id
  name FULLTEXT

table2
  id
  doc_id
  a_field FULLTEXT

table3
  id
  doc_id
  another_field FULLTEXT

(我意识到这看起来很愚蠢,但那是因为我删除了所有其他字段和表格以简化它)。

所以基本上我想对namea_fieldanother_field 进行全文搜索,然后将结果显示为documents 的列表,最好是导致找到该文档的原因,例如如果another_field 匹配,我会显示another_field 是什么。

我开始研究一个系统,通过该系统执行三个全文搜索查询并将结果插入到具有如下结构的表中:

search_results
  table_name
  row_id
  score

(稍后可以使用例如搜索词的散列将结果缓存几天)。

这个想法有两个问题。第一个是同一文档在搜索结果中最多可以出现 3 次不同的分数。相反,如果搜索词在两个表中匹配,它应该有一个结果,但得分更高。

第二个是解析结果很困难。我想显示一个文档列表,但如果没有某种连接,我不会立即知道doc_id;但是要加入的表取决于table_name 列,我不确定如何完成。

想要像这样搜索多个相关表一定是很常见的事情,所以我想我要问的是我是否以正确的方式处理这个问题?谁能告诉我最好的方法。

【问题讨论】:

    标签: mysql full-text-search


    【解决方案1】:

    我会创建一个非规范化的单一索引。即,将所有三种文档类型放入一个包含 doc_id、doc_type 和单个全文块字段的表中。然后您可以一次搜索所有三种文档类型。

    您可能还会发现Lucene 在这种情况下是有意义的。它为您提供更快的搜索速度,以及关于搜索和评分工作原理的更多功能。

    缺点是您要为每条记录保留一个单独的非规范化文本副本。好处是搜索速度更快。

    【讨论】:

    • 我认为这不合适。例如,table2 是一个树结构,每个条目都有一个父 id,每个文档将包含其中一个树,其中包含多达 20-30 个项目。我真的不能把这些数据放在文档表中。但我希望它被搜索,如果找到匹配项,则在结果中显示相应的文档。
    • 索引不是您的数据库表。它是一个单独的非规范化副本,仅用于快速搜索。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多