SQL Server全文搜索

13

我目前在一个应用程序上工作,我们有一个SQL-Server数据库,需要使全文搜索功能正常工作,以便我们可以搜索人名。

目前用户可以输入一个名称字段来搜索3个不同的varchar列:姓、名和中间名。

例如,如果我有以下信息的3行:

1 - Phillip - J - Fry

2 - Amy - NULL - Wong

3 - Leo - NULL - Wong

如果用户输入名称“Fry”,它将返回第1行。但是,如果他们输入Phillip Fry、Fr或Phil,他们将什么也得不到...我不明白为什么会这样。如果他们搜索Wong,他们将得到第2和第3行,如果他们搜索Amy Wong,他们还是什么都得不到。

目前的查询使用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 = '"'+@Name+'"'
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;  
....

有什么想法吗?为什么这个全文搜索功能不能正常工作?

5个回答

5
如果你只是在搜索人名,最好不要使用全文索引。全文索引适用于大型文本字段的情况,但如果你的每个字段只有一个单词,那么使用全文索引可能并不能带来太多额外的收益。等待全文索引重新索引以便可以搜索新记录是其中的一些问题之一。
你可以使用以下查询语句。将搜索字符串拆分为单词,并创建一个包含所有搜索项的列表。
选择 FirstName、 MiddleName 和 LastName 从 person WHERE Firstname like @searchterm1 + '%' or MiddleName like @searchterm1 + '%' or LastName like @searchterm1 + '%' or Firstname like @searchterm2 + '%' 等等....

4

FreeTextTable应该可以正常工作。

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

@SearchString应该包含像“Phillip Fry”这样的值(一个长字符串,其中包含所有查找字符串,用空格分隔)。

如果您想搜索Fr或Phil,应使用星号:Phil *和Fr *

'Phil'寻找确切的单词'Phil'。 'Phil *'寻找以'Phil'开头的每个单词


4

感谢各位的回复,我最终成功了。参考了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 = '"*'+@SearchString+'*"'

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和注释列的列。

感谢您的帮助。


请注意,通配符星号仅在搜索术语的末尾使用时起作用。搜索术语开头的星号将被全文搜索引擎忽略。 - RSW
谢谢你的回答。你忘了 Lila 和 Bender。我可以用 Lucene 吗? - Rony Tesler

2

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

换句话说,创建一个数据视图,将所有拆分的字段(如名字和姓氏)转换为连接的字段,即full_name。

然后在该视图上进行搜索。这通常会使搜索查询更简单。


2

如果您正在寻找替代全文搜索的工具,可以考虑查看Lucene.net


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接