考虑下表:
人
我们暂时假设这个表的两列都有一个全文索引。
我们假设我想在这张桌子中找到所有名为“John Smith”的人。以下查询似乎是完成此任务的完美理性方法:
SELECT * from People p
INNER JOIN CONTAINSTABLE(People,*,'"John*" AND "Smith*"')
不幸的是,假设在 People 表中没有FirstName或LastName列中包含“John”和“Smith”的记录,这将不会返回任何结果。它与FirstName列中的“John”和LastName列中的“Smith”记录不匹配,反之亦然。
我的问题是:如何实现我上面要做的事情?请考虑简化上面的示例。我正在使用的真实表有十列,我收到的输入是一个单独的字符串,它根据标准断字符(空格,短划线等)分开。
答案 0 :(得分:0)
答案 1 :(得分:0)
这是我最终做的事情:
我上面给出的例子可能有点过于简单了。在实际应用程序中,全文索引实际上位于表示两个表的连接的视图上。这样做的一个优点是视图的模式可以独立于构建它的表。
要使用上面的(简化)示例,我有一个如下所示的表:
<强>人强>
索引实际构建的视图如下所示:
<强> PeopleView 强>
要解决这个问题,我修改了视图的模式,以便现在有一个(加一个键)列,其中包含视图所代表的整个表的内容:
<强> PeopleView 强>
当然,必须重建全文目录,考虑到视图的新架构,但所有更改都是在数据库级别进行的,这意味着不会对应用程序代码进行任何更改。我必须对视图进行一些调整以处理可能具有空值的列,因为NULL与任何内容连接= NULL。