全文搜索关系数据库
本文关键字:关系数据库 搜索 文搜索 | 更新日期: 2023-09-27 17:50:49
我很快就会在我的一个项目中需要一个全文搜索,所以我开始研究一些搜索引擎。但是,例如Azure搜索……从我目前所看到的来看,没有一个引擎能够跨多个表进行搜索,并且这些表之间存在关系。
例如…我不能简单地要求引擎搜索"红色"这个词,然后它就会"爬行"所有的表(或索引表),并返回命中的结果,让我有可能遍历它的关系数据。
例如…假设我们有一个名为Cars的表。我们还有另外两张桌子,一张叫颜色,另一张叫品牌。现在Cars与表Color和表Brand有一个关系/FK ..当我使用我的搜索引擎时,我希望能够搜索所有具有所有有效关系设置的颜色为"红色"的汽车,然后能够获得汽车(不仅是颜色的数据,而且是实际的car -data)。
从我所看到的搜索引擎(包括Azure搜索),需要我"扁平化"我的数据的关系结构到一个单一的记录..这看起来很奇怪,因为这最终会产生相当多的数据,并且将更难"映射"回具有关系的数据实体。
所以…关于如何通过关系数据库(在我的情况下,数据库将是SQL Server数据库)进行全文搜索的任何想法?
Br,点
创建一个扁平实体是最好的方法,如果有的话,它可以正确地跨多个表对全文搜索进行评分。我的意思是,在一个查询中搜索多个表是可能的(例如:SELECT * FROM CONTAINSTABLE(Cars,*,'sedan') join CONTAINSTABLE(Brands,*,'honda') on...
),但每次搜索的分数范围会有很大差异,所以计算一个可靠的统一分数是非常困难的,甚至是不可能的。对于扁平实体,这不是问题。
扁平化实体不会(也不应该)替换现有的表。它应该是数据库中的一个单独的表。为了保持同步,你可以1)创建一个定期插入/更新它的作业,或者2)你可以利用更改跟踪来实现更实时的功能。
扁平化实体应该包含允许您映射回其他实体的列。Cars的扁平实体示例:
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全文索引的局限性和我之前提到的跨多表的分数问题的最好方法。