2008-08-19 172 views
12

我目前正在研究一个我们有SQL-Server数据库的应用程序,并且我需要得到一个全文搜索工作,使我们能够搜索人名。SQL Server全文搜索

当前用户可以输入一个名称字段,该字段可以搜索3个不同的varchar cols。第一,最后,中间名

所以说我有3行与以下信息。

1 - 菲利普 - J - 弗莱

2 - 艾米 - NULL - 黄

3 - 利奥 - NULL - 黄

如果用户输入一个名称,如 '弗莱',它会返回第1行。但是,如果他们进入Phillip Fry,Fr或Phil,他们什么也得不到。我不明白为什么要这么做。如果他们搜索黄,他们会得到第2和第3排,如果他们搜索艾米黄他们什么也没有得到。

当前查询使用的是CONTAINSTABLE,但我已经使用FREETEXTTABLE,CONTAINS和FREETEXT进行切换,结果中没有任何明显差异。表格方法是首选,因为它们返回相同的结果,但是具有排名。

这是查询。

.... 
@Name nvarchar(100), 
.... 
--""s added to prevent crash if searching on more then one word. 
DECLARE @SearchString varchar(100) 
SET @SearchString = '"'[email protected]+'"' 
SELECT Per.Lastname, Per.Firstname, Per.MiddleName 
FROM Person as Per 
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL 
ON Per.Person_ID = KEYTBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
ORDER BY KEYTBL.RANK DESC; 
.... 

任何想法......?为什么此全文搜索无法正常工作?

回答

3

谢谢你们的回应,我终于可以让它起作用了。有了Biri和Kibbee的答案。我需要在字符串中添加*并将其分解为空格才能工作。所以,最后我得到了

.... 
@Name nvarchar(100), 
.... 
--""s added to prevent crash if searching on more then one word. 
DECLARE @SearchString varchar(100) 

--Added this line 
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*') 
SET @SearchString = '"*'[email protected]+'*"' 

SELECT Per.Lastname, Per.Firstname, Per.MiddleName 
FROM Person as Per 
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL 
ON Per.Person_ID = KEYTBL.[KEY] 
WHERE KEY_TBL.RANK > 2 
ORDER BY KEYTBL.RANK DESC; 
.... 

有被搜查更多的领域时我只是简化了它的问题,我们对此深感抱歉,我不认为这会影响答案。它实际上会搜索一个包含csv昵称和备注栏的列。

感谢您的帮助。

+0

请注意,作为通配符的星号只有在搜索词的**结尾**处使用时才起作用。搜索词开头的星号被全文搜索引擎忽略。 – RSW 2013-01-26 16:05:31

4

FreeTextTable应该可以工作。

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString应包含如“菲利浦弗莱”的值(包含所有由空格分隔的查找字符串的一个长字符串)。

如果你想搜索的神父或菲尔,你应该使用星号:菲尔*和FR *

“菲尔”正在寻找确切的词“菲尔”。 'Phil *'正在寻找以'Phil'开头的每一个单词

4

如果您只是在搜索人名,那么甚至不使用全文索引可能对您最有利。当你有很大的文本字段时,全文索引是有意义的,但是如果你主要处理每个字段的一个字,我不确定你会从全文索引中得到多少额外的内容。在搜索新记录之前等待全文索引重新索引自己可能是许多问题之一。

您可以进行如下查询。将搜索字符串拆分为空格,并创建搜索项的列表。

 
Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%' 
or MiddleName like @searchterm1 + '%' 
or LastName like @searchterm1 + '%' 
or Firstname like @searchterm2 + '%' 
etc.... 
2

另一种方法可能是将搜索从各个字段中抽象出来。

换句话说创建你的数据的图,其转动像名姓的所有拆分字段放入级联字段即FULL_NAME

在视图上,然后搜索。这可能会使搜索查询更简单。

2

您可能想要查看Lucene.net作为全文的替代选项。