我已经创建了这个小样本表格。
Id是主键,是identity = True
现在,当我尝试创建FullText目录时,我无法搜索Id。
如果我按照这个向导,我最终会得到一个目录,只能搜索人名。我真的很想知道,我怎样才能对Id和Name进行全文搜索。
SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, 'anders' );
SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' );
我希望他们返回相同的结果,第一个返回id = 1 name = Anders,而第二个查询不返回任何内容。
看起来问题在于使用 int ,但是不可能欺骗FullText来支持它吗?
创建了一个视图,我将int转换为nvarchar。 CONVERT(nvarchar(50), Id) AS PersonId
这确实使我可以在创建全文目录时选择该列,但它仍然不会让我找到它来搜索ID。
答案 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”部分。