关系数据库的全文搜索?

时间:2015-05-27 09:04:37

标签: c# sql-server azure full-text-search

我很快就需要在我的一个项目中进行全文搜索,所以我开始研究那里的一些搜索引擎......例如Azure搜索,但是......从我到目前为止看到的,没有一个引擎能够跨多个表搜索这些表之间的关系。

所以例如..我不能简单地要求引擎搜索“red”这个词,然后它会“抓取”所有表(或索引表),然后返回命中,我可以单步执行它的关系数据..

例如..假设我们有一个名为Cars的表。我们还有另外两个表,一个名为Color,另一个名为Brand ..现在汽车与表Color和表Brand有关系/ FK ..当我使用我的搜索引擎时,我希望能够搜索所有具有“红色”颜色的所有有效关系设置的汽车,然后能够获得汽车(不仅是颜色的数据,而且是实际的汽车数据)。

从我所看到的必须搜索引擎(包括Azure搜索),要求我将我的数据的关系结构“扁平化”成一个单独的记录..这看起来很奇怪,因为这会导致相当多的数据和用关系“映射”回我的数据实体会更加困难。

那么......关于如何通过关系数据库进行全文搜索的任何想法(在我的情况下,数据库将是一个SQL Server数据库)?

BR, INX

1 个答案:

答案 0 :(得分:0)

创建展平实体是最好的方法,如果有的话,可以在多个表中正确评分全文搜索。我的意思是,可以在1个查询中搜索多个表(例如:SELECT * FROM CONTAINSTABLE(Cars,*,'sedan') join CONTAINSTABLE(Brands,*,'honda') on...),但每个搜索的得分范围会有很大差异,因此计算可靠的统一分数介于两者之间非常难以实现。这对于扁平化实体来说不是问题。

展平的实体不会(也不应该)替换现有的表格。它应该是数据库中的单独表。为了使其保持同步,您可以1)创建定期插入/更新它的作业,或者2)您可以利用change tracking获得更实时的内容。

展平实体应包含允许您映射回其他实体的列。汽车展平实体的示例:

Cars_FullText
-------------
CarId   <-- these 3 columns from the Cars table
CarName*
CarDescription
ColorId   <-- these 2 columns from the Colors lookup table
ColorName*
BrandId   <-- these 2 columns from the Brands lookup table
BrandName* ...

* this column is full text indexed

是的,您的数据库需要更多存储空间。是的,这确实为系统添加了另一部分。但我认为考虑到SQL Server全文索引的限制以及我之前提到的多表分数问题,这是最好的方法。