2010-04-30 47 views
2

我有三个表,所有表都有一个带有全文索引的列。用户将在一个文本框中输入搜索条件,然后搜索所有三个表。在许多表上全文搜索

这是更好地用一个例子解释:

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 

(这可以在以后缓存结果做了几天例如搜索项的散列)。

这个想法有两个问题。首先是同一文件可以在搜索结果中以不同的分数进行三次。相反,如果搜索词在两个表中匹配,它应该有一个结果,但得分较高。

第二个是解析结果很困难。我想显示一个文件列表,但我不立即知道doc_id没有加入某种类型;但是加入的表依赖于table_name列,我不确定如何完成此操作。

想要像这样搜索多个相关的表必须是一个普通的事情,所以我想我问的是我以正确的方式接近这个?有人可以告诉我这样做的最好方法吗?

回答

1

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

您可能还会发现在这种情况下Lucene会有意义。它使您能够更快地进行搜索,以及围绕搜索和评分工作的更多功能。

缺点是您要为每条记录保留一个独立的文本副本。好处在于搜索速度更快。

+0

我认为这不合适。例如,table2是一个树形结构,每个条目都有一个父ID,每个文档将有一个树中有多达20-30个条目。我无法将这些数据真的放在文档表中。但我希望它被搜索,如果找到匹配,结果中显示相应的文档。 – Rob 2010-04-30 14:51:33

+0

索引不是您的数据库表。这是一个单独的非规范化副本,仅用于快速搜索。 – 2010-05-18 01:56:25