我有三个表,所有表都有一个带有全文索引的列。用户将在单个文本框中输入搜索词,然后搜索所有三个表。
通过示例更好地解释了这一点:
documents
doc_id
name FULLTEXT
table2
id
doc_id
a_field FULLTEXT
table3
id
doc_id
another_field FULLTEXT
(我意识到这看起来很愚蠢,但那是因为我已经删除了所有其他字段和表格来简化它。)
所以基本上我想在name
,a_field
和another_field
上进行全文搜索,然后将结果显示为documents
的列表,最好是由什么引起的要找到的那份文件,例如如果another_field
匹配,我会显示another_field
是什么。
我开始研究一个系统,通过该系统执行三个全文搜索查询,并将结果插入到具有以下结构的表中:
search_results
table_name
row_id
score
(稍后可以使用例如搜索词的哈希值来缓存几天的结果。)
这个想法有两个问题。首先,同一文档可以在搜索结果中最多三次,得分不同。相反,如果搜索词在两个表中匹配,则应该有一个结果,但得分更高。
第二是解析结果很困难。我想显示一份文件清单,但如果没有某种联合,我不会立即知道doc_id
;但是要加入的表依赖于table_name
列,我不知道如何实现。
想要搜索这样的多个相关表必须是常见的事情,所以我想我问的是我是否以正确的方式接近这个?有人可以告诉我最好的方法。
答案 0 :(得分:1)
我会创建一个非规范化的单个索引。即,将所有三种文档类型放入一个表中,其中包含doc_id,doc_type和单个全文块的字段。然后,您可以一次搜索所有三种文档类型。
您可能还会发现Lucene在这种情况下会有意义。它为您提供了更快的搜索速度,以及有关搜索和评分工作方式的更多功能。
缺点是你要为每条记录保留一份单独的非文本副本。好处是搜索速度要快得多。