SQL Server 全文搜索

SQL Server Full Text Searching

提问人: 提问时间:8/20/2008 最后编辑:10 revs, 7 users 49%corymathews 更新时间:11/1/2012 访问量:3891

问:

我目前正在开发一个应用程序,我们有一个 SQL-Server 数据库,我需要进行全文搜索,以便我们搜索人们的名字。

目前,用户可以在搜索 3 个不同的 varchar cols 的名称字段中输入 a。名字、姓氏、中间名

所以假设我有 3 行,其中包含以下信息。

1 - 菲利普 - J - 弗莱

2 - 艾米 - NULL - 黄

3 - 里奥 - NULL - 黄

如果用户输入名称(如“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;  
....

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

sql-server 全文搜索

评论


答:

4赞 Biri 8/20/2008 #1

FreeTextTable 应该可以工作。

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

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

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

“菲尔”正在寻找“菲尔”这个词。“Phil*”正在寻找以“Phil”开头的每个单词

5赞 Kibbee 8/20/2008 #2

如果您只是搜索人们的名字,那么甚至不使用全文索引可能符合您的最大利益。当您有大型文本字段时,全文索引是有意义的,但如果您主要处理每个字段一个单词,我不确定您会从全文索引中获得多少额外收益。等待全文索引重新编制索引,然后才能搜索新记录可能是许多问题之一。

您可以进行如下查询。在空格上拆分搜索字符串,并创建搜索词列表。

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....
2赞 Tim 8/20/2008 #3

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

换句话说,在数据上创建一个视图,该视图将所有拆分字段(如名字姓氏)转换为串联字段,即full_name

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

4赞 corymathews 8/20/2008 #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 和注释列的列。

感谢您的帮助。

评论

0赞 RSW 1/27/2013
请注意,星号作为通配符仅在搜索词末尾使用时才有效。搜索词开头的星号会被全文搜索引擎忽略。
0赞 Rony Tesler 9/26/2014
谢谢你的回答。你忘了莉拉和本德。我可以为此使用 Lucene 吗?
2赞 Brett Veenstra 8/21/2008 #5

您可能希望查看 Lucene.net 作为全文的替代方法。