全文目录无法搜索主键

时间:2011-09-28 10:13:56

标签: sql sql-server full-text-search sql-server-2008-r2

我已经创建了这个小样本表格。

enter image description here

Id是主键,是identity = True

现在,当我尝试创建FullText目录时,我无法搜索Id。

enter image description here

如果我按照这个向导,我最终会得到一个目录,只能搜索人名。我真的很想知道,我怎样才能对Id和Name进行全文搜索。

修改

enter image description here

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, 'anders' );

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' );

我希望他们返回相同的结果,第一个返回id = 1 name = Anders,而第二个查询不返回任何内容。

编辑2

看起来问题在于使用 int ,但是不可能欺骗FullText来支持它吗?

编辑3

创建了一个视图,我将int转换为nvarchar。 CONVERT(nvarchar(50), Id) AS PersonId这确实使我可以在创建全文目录时选择该列,但它仍然不会让我找到它来搜索ID。

2 个答案:

答案 0 :(得分:2)

通过阅读您的问题,我不确定您是否理解全文索引的目的。全文索引用于在表上搜索TEXT(一列或多列)。而不仅仅是替代:

SELECT *
FROM table
WHERE col1 LIKE 'Bob''s Pizzaria%'
OR col2 LIKE 'Bob''s Pizzaria%'
OR col3 LIKE 'Bob''s Pizzaria%'

它还允许您搜索“Bob's Pizzaria”的变体,例如“Bobs Pizz e ria”(如果有人拼错了比特币或忘记加入'或过度热心的反SQL - 注射代码剥离了')或“Robert's Pizza”或“Bob's Pizzeria”或“Bob's Pizza”等。它还允许您搜索文本列的“中间”(char,varchar,nchar,nvarchar等) 。)没有可怕的“%Bob%Pizza%”,消除了使用传统索引的任何机会。

然而,这个讲座已经足够了。要回答您的具体问题,我会创建一个单独的列(不是“计算列”)“IdText varchar(10)”,然后是AFTER INSERT触发器,如下所示:

UPDATE t
SET IdText = CAST(Id AS varchar(10))
FROM table AS t
INNER JOIN inserted i ON i.Id = t.Id

如果您不知道“插入”是什么,请参阅此MSDN article或搜索“堆叠溢出”以查找“已插入的触发器”。然后,您可以在全文索引中包含IdText列。

同样,从你的例子中我不确定全文索引是你应该在这里使用的,但是你的实际情况可能会有所不同,你刚刚为这个问题创建了这个例子。此外,全文索引相对“昂贵”,因此请确保进行成本效益分析。以下是关于全文索引使用的Stack Overflow问题。

答案 1 :(得分:1)

为什么不做这样的查询。

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' )
OR ID = 1

如果首先检查搜索字词是否为数字,您可以不使用“OR ID = 1”部分。